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

Понимание метода Ruby #call

def test
  "Hello World"
end

p method(:test).call  #"Hello World"
p method("test").call #"Hello World"

Мой вопрос: что происходит, когда мы передаем символ методу call? Будет ли ruby ​​преобразовывать символ в строку и затем выполнить его? Если да, то в чем цель?

А если нет, то что на самом деле происходит? Не могли бы вы рассказать? Извините, если я не могу понять.

4b9b3361

Ответ 1

Когда вы выполняете def test ... вне какого-либо явного определения класса или модуля, вы по существу находитесь в контексте класса Object, поэтому test теперь является экземпляром метода Object

В irb...

1.8.7 :001 > def test
1.8.7 :002?>   "Hello world"
1.8.7 :003?>   end
 => nil
1.8.7 :004 > Object.instance_methods.sort
 => ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_exec", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "tap", "test", "to_a", "to_enum", "to_s", "type", "untaint"]

method - это метод экземпляра класса Object, который наследуется по существу всем. Когда вы вызываете method вне какого-либо явного определения класса или модуля, вы по существу вызываете его как метод класса Object, и этот класс сам является экземпляром Class, который является подклассом Object (извините - я знаю, что немного сбивает с толку).

Итак - метод method принимает строку или символ и возвращает объект, инкапсулирующий связанный метод этого имени на том же объекте, на который был вызван .method. В этом случае метод test связан с объектом Object.

method(:test).call означает вызов метода test Object, который вы определили ранее через def test ....