2013-02-24 25 views
13
def test 
    "Hello World" 
end 

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

La mia domanda è: cosa succede quando si passa un simbolo al metodo call? Ruby convertirà il simbolo in una stringa e poi lo eseguirà? Se è così, allora qual è lo scopo?la comprensione del metodo di Rubino #CALL

E se no, allora cosa succede realmente? Potete per favore elaborare? Scusa se non riesco a chiarirmi.

+0

Qualsiasi cosa faccia internamente a Ruby in C. Non dovrebbe importare. – sawa

risposta

14

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 ....

+0

@MisterCal Dalla console irb, 'Object.class' => Class. –

+0

Ah! Eliminata. Ho fatto un'ipotesi basata sul fatto che Object è una superclasse di Class. Vedo ora, un po 'di confusione ahah. – MisterCal

Problemi correlati