Что эквивалентно «справочнику по методам» в Ruby - PullRequest
23 голосов
/ 20 апреля 2010

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

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


 x = MyClass()
 method = x.myMethod

 print method() # prints Hi

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

Ответы [ 2 ]

28 голосов
/ 20 апреля 2010

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

4 голосов
/ 20 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...