Ответ 1
Вам нужно захватить метод, используя method
с именем методов в качестве аргумента. Это вернет вам экземпляр типа method
, который можно вызвать с помощью call()
.
class MyClass
def myMethod
"Hi"
end
end
x = MyClass.new
m = x.method(:myMethod)
# => #<Method: MyClass#myMethod>
puts m.call
# You can also do m[] instead of m.call()
Обратите внимание, что любые аргументы должны быть добавлены к методу call
.
Во многих практических случаях, однако, нет необходимости, чтобы сам метод сохранялся в переменной в Ruby; если вы просто хотите динамически вызывать метод (т.е. отправлять сообщение объекту), и нет необходимости сохранять этот метод, вы также можете использовать метод send
(или __send__
в случае конфликтов имен).
x = MyClass.new
puts x.send :myMethod # also possible with a string: m.send "myMethod"
# "Hi"
Любые аргументы должны следовать имени метода:
puts x.send(:myMethod, arg1, arg2)
Использовать его, как это, вероятно, больше похоже на Ruby, так как концепция классов методов не так важна, как в Python. В Python вы всегда можете думать о двухэтапном механизме, когда делаете что-то вроде a_string.split()
; сначала вы берете метод с помощью a_string.split
, а затем вы вызываете его (либо неявно с ()
, либо явно с помощью __call__()
). Итак, сокращение этого двухступенчатого механизма вполне закономерно.
Ruby больше основан на передаче сообщений и фактически получает класс метода в Ruby, вам придется сделать еще немного работы, потому что в некотором роде объект метода должен быть создан для вас в этот момент. Итак, если вам действительно не нужен объект "Методы" в Ruby, вы должны придерживаться абзаца передачи сообщения и просто использовать send
.