Quando si esegue def test ...
al di fuori di qualsiasi classe esplicita o definizione del modulo, si sono essenzialmente nel contesto classe Object, in modo test
è ora un metodo di Object
In irb
esempio ...
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
è un metodo di istanza della classe Object
che viene ereditata essenzialmente da tutto. Quando si chiama method
al di fuori di qualsiasi classe esplicita o definizione del modulo, si sono essenzialmente la invoca come un metodo della classe Object
, e che la classe è di per sé un esempio di Class
, che è una sottoclasse di Object
(scusate - so che è un un po 'di confusione da seguire).
Quindi, il metodo method
accetta una stringa o un simbolo e restituisce un oggetto che incapsula il metodo associato di quel nome sullo stesso oggetto che è stato chiamato .method
. In questo caso, questo è il metodo test
associato all'oggetto Object
.
method(:test).call
significa chiamare il metodo test
di Object
che è ciò che è stato precedentemente definito tramite def test ...
.
Qualsiasi cosa faccia internamente a Ruby in C. Non dovrebbe importare. – sawa