Класс 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 Poignant Guide , вы можете перейти к «Массиву Двемти», чтобы перейти к метапрограммированию.