Подтвердить что ты не робот

Что эквивалентно "ссылке на метод" в Ruby

Например, в python можно назначить метод переменной:

class MyClass 
    def myMethod(self):
        return "Hi"


 x = MyClass()
 method = x.myMethod

 print method() # prints Hi

Я знаю, что это должно быть возможно в Ruby, но я не знаю, что такое синтаксис.

4b9b3361

Ответ 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.

Ответ 2

Я думаю, что вы ищете 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