该类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 的数组”以了解元编程的内容。