Rubyオブジェクト向けプログラミングのいくつかの高度な応用


1.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]