2013-09-20 35 views
5

Tôi đã đi qua Ruby Koans và tôi đã tìm thấy about_open_classes.rb koan thú vị. Đặc biệt là thử nghiệm cuối cùng, nơi họ sửa đổi phương pháp Integer#even?. Tôi muốn chơi xung quanh với khái niệm này vì vậy tôi đã mở Irb và cố gắng chạy Integer.respond_to?(:even?), nhưng với sự ngạc nhiên của tôi tôi đã sai. Sau đó, tôi đã thử Fixnum.respond_to?(:even?) và nhận được sai. Tôi cũng đã thử Integer.respond_to?(:respond_to?) và nhận được sự thật và khi tôi làm 2.even? Tôi cũng nhận được sự thật. Tôi không biết chuyện gì đang diễn ra. Bất cứ ai có thể nói những gì tôi đang mất tích?Tại sao Integer.respond_to? (: Even?) Trả về false?

Trả lời

9

Một thể hiện của Fixnum sẽ respond_to? :even?, nhưng Fixnum lớp tự sẽ không

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

>> 3.class 
=> Fixnum 

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

>> Fixnum.class 
=> Class 

Bạn có thể thấy cách làm việc này bằng cách định nghĩa lớp thử nghiệm của riêng bạn:

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

Vì bạn đánh tôi cho một câu trả lời hay, tôi đã thêm vào những gì tôi đã có cho những gì đang xảy ra dưới mui xe. –

Các vấn đề liên quan