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

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

Moje pytanie brzmi: co się dzieje, gdy przekazujemy symbol do metody call? Czy ruby ​​przekształci symbol w String, a następnie wykona go? Jeśli tak, to jaki jest jego cel?Zrozumienie metody Ruby #call

A jeśli nie, to co się właściwie dzieje? Czy mógłbyś rozwinąć? Przepraszam, jeśli nie dam się wyjaśnić.

+0

Cokolwiek robi, robi się wewnętrznie dla Rubiego w C. Nie powinno to mieć znaczenia. – sawa

Odpowiedz

14

Po wykonaniu def test ... poza jakimkolwiek wyraźnej definicji klasy lub modułu, jesteś w istocie w kontekście klasy Object, więc test jest obecnie metoda instancji Object

W 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 jest metodą instancji klasy Object, która jest dziedziczona zasadniczo przez wszystko. Po wywołaniu poza jakąkolwiek jawną definicją klasy lub modułu, zasadniczo wywołujesz ją jako metodę klasy Object, a ta klasa sama jest instancją klasy Class, która jest podklasą Object (przepraszam - wiem, że to jest nieco mylące do naśladowania).

Metoda Metoda przyjmuje ciąg lub symbol i zwraca obiekt otaczający związaną metodę o tej nazwie na tym samym obiekcie, który został wywołany. W tym przypadku jest to metoda test związana z obiektem Object.

method(:test).call oznacza wywołanie metody test z Object, która jest zdefiniowana wcześniej przez def test ....

+0

@MisterCal Z konsoli irb, 'Object.class' => Class. –

+0

Ah! Usunięto. Założyłem założenie, że obiekt jest nadklasą klasy. Teraz widzę, trochę mylące haha. – MisterCal