2013-09-20 23 views
5

Przeszedłem przez Ruby Koans i znalazłem interesujący temat about_open_classes.rb koan. Specjalnie ostatni test, w którym modyfikuje się metodę Integer#even?. Chciałem bawić się z tą koncepcją, więc otworzyłem Irb i próbowałem uruchomić Integer.respond_to?(:even?), ale ku mojemu zaskoczeniu dostałem fałszywego. Potem próbowałem Fixnum.respond_to?(:even?) i otrzymałem fałsz. Próbowałem też Integer.respond_to?(:respond_to?) i spełniłem swoją rolę, a kiedy wykonuję 2.even?, również się sprawdzam. Nie mam pojęcia, co się dzieje. Czy ktoś może powiedzieć, czego mi brakuje?Dlaczego wartość Integer.respond_to? (: Even?) Zwraca wartość false?

Odpowiedz

9

Instancja Fixnum będzie respond_to? :even?, ale sama klasa Fixnum nie będzie

>> 3.respond_to? :even? 
=> true 

>> 3.class 
=> Fixnum 

>> Fixnum.respond_to? :even? 
=> false 

>> Fixnum.class 
=> Class 

Można zobaczyć, jak to działa, definiując własne klasy badawczej:

class Test 
    def self.a 
    "a" 
    end 
    def b 
    "b" 
    end 
end 

>> Test.respond_to? :a 
>> true 
>> Test.respond_to? :b 
>> false 

>> t = Test.new 
>> t.respond_to? :a 
>> false 
>> t.respond_to? :b 
>> true 
+1

Skoro mnie pokonać na dobrą odpowiedź dodałem to, co miałem do tego, co dzieje się pod maską. –

Powiązane problemy