например, в Python возможно присвоить метод переменной:
class MyClass
def myMethod(self):
return "Hi"
x = MyClass()
method = x.myMethod
print method() # prints Hi
Я знаю, что это должно быть возможно в Ruby, но я не знаю то, что является синтаксисом.
Вам нужно получить метод, используя метод
с именем метода в качестве аргумента. Это вернет вам экземпляр типа 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
.
Я думаю, вы ищете Proc или лямбда-блок
x = Proc.new { return "Hello World" }
puts x.call
x = lambda { return "Hello World" }
puts x.call
Я бы прочитал этот короткий пост - есть небольшая, но существенная разница в способах использования методов вести себя http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby