object
クラスは を定義し、すべてのオブジェクトはこれsend
を継承します。オブジェクトをsend
メソッドに「送信」します。メソッドのsend
パラメーターは、呼び出したいメソッドの名前のシンボルであり、その後に任意の引数とオプションのブロックが続きます。も使用できます__send__
。
>> "heya".send :reverse
=> "ayeh"
>> space = %w( moon star sun galaxy )
>> space.send(:collect) { |el| el.send :upcase! }
=> ["MOON", "STAR", "SUN", "GALAXY"]
編集..
define_method
おそらく次のメソッドを使用したいと思うでしょう:
String.class_eval {
define_method :hello do |name|
self.gsub(/(\w+)/,'hello') + " #{name}"
end
}
puts "Once upon a time".hello("Dylan")
# >> hello hello hello hello Dylan
これにより、インスタンス メソッドが追加されます。クラスメソッドを追加するには:
eigenclass = class << String; self; end
eigenclass.class_eval {
define_method :hello do
"hello"
end
}
puts String.hello
# >> hello
ただし、ブロックを期待するメソッドを定義することはできません。
Why's Poignant Guide からこの章を読むのは良いことかもしれません。「Dwemthy's Array」までスキップして、メタプログラミングの内容に進むことができます。