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