Rubyオブジェクト向けプログラミングのいくつかの高度な応用
1.sendの使い方
RUBYでは実行時にそのオブジェクトが呼び出されることを決定することができ、sendメソッドはこれを行い、symbol変数をパラメータとして受け入れます.
まず、非常に簡単な例を示します.
もちろんsendメソッドも使用できますが、出現する可能性のある自分のクラスで定義されているsendメソッドと区別するために_send__方法
1.9ではsendメソッドはprivateメソッドを呼び出すことはできませんが、__を使用することができます.send!で呼び出されます.
以下に、ソートの比較的完全な例を示します.
RUBYでは実行時にそのオブジェクトが呼び出されることを決定することができ、sendメソッドはこれを行い、symbol変数をパラメータとして受け入れます.
まず、非常に簡単な例を示します.
class Foo
def foo
"aa"
end
end
puts Foo.new.__send__(:foo)
もちろんsendメソッドも使用できますが、出現する可能性のある自分のクラスで定義されているsendメソッドと区別するために_send__方法
1.9ではsendメソッドはprivateメソッドを呼び出すことはできませんが、__を使用することができます.send!で呼び出されます.
class Foo
private
def foo
"aa"
end
end
p Foo.new.__send!(:foo) # => nil
p Foo.new.send(:foo) #private method `foo' called for #<Foo:0xa89530> (NoMethodError)
以下に、ソートの比較的完全な例を示します.
class Person
attr_reader :name, :age, :height
def initialize(name, age, height)
@name, @age, @height = name, age, height
end
def inspect
"#@name #@age #@height"
end
end
class Array
def sort_by(sym) # Our own version of sort_by
self.sort {|x,y| x.send(sym) <=> y.send(sym) }
end
end
people = []
people << Person.new("Hansel", 35, 69)
people << Person.new("Gretel", 32, 64)
people << Person.new("Ted", 36, 68)
people << Person.new("Alice", 33, 63)
p1 = people.sort_by(:name)
p2 = people.sort_by(:age)
p3 = people.sort_by(:height)
p p1 # [Alice 33 63, Gretel 32 64, Hansel 35 69, Ted 36 68]
p p2 # [Gretel 32 64, Alice 33 63, Hansel 35 69, Ted 36 68]
p p3 # [Alice 33 63, Gretel 32 64, Ted 36 68, Hansel 35 69]