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

например, в Python возможно присвоить метод переменной:

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


 x = MyClass()
 method = x.myMethod

 print method() # prints Hi

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

24
задан OscarRyz 20 April 2010 в 19:00
поделиться

2 ответа

Вам нужно получить метод, используя метод с именем метода в качестве аргумента. Это вернет вам экземпляр типа 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 .

28
ответ дан 28 November 2019 в 23:57
поделиться

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

5
ответ дан 28 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: