Вам нужно получить метод, используя 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, вам придется проделать еще некоторую работу, потому что в некотором смысле объект метода должен быть создан для вас на этом этапе. Итак, если вам действительно не нужен какой-то объект Methods в Ruby, вам следует придерживаться абстракции передачи сообщений и просто использовать send
.