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 ...
.
Cokolwiek robi, robi się wewnętrznie dla Rubiego w C. Nie powinno to mieć znaczenia. – sawa