2013-07-27 56 views
6

編輯:我使用Ruby 2.0.0版本困惑於「respond_to?」方法

我有一個文件example.rb

def say_hello 
    puts 'hi' 
end 

puts respond_to?(:say_hello) 
say_hello 

當運行該代碼時,輸​​出以下代碼:

false 
hi 

我很困惑爲什麼false會返回「respond_to?」當我可以使用該方法時。

「respond_to?」方法似乎工作,雖然這樣說:

class Person 
    def say_bye 
    puts 'bye' 
    end 
end 

mike = Person.new 
puts mike.respond_to?(:say_bye) 
mike.say_bye 

輸出是:「respond_to代碼」

true 
bye 

沒有人有任何見解,爲什麼在第一種情況下返回false?

+1

有趣,我剛?在irb中運行它,它爲我工作。你是否試圖通過自我調用來更加明確? '把self.respond_to?(:say_hello)' – AdamT

+0

self.respond_to(:say_hello)返回false。 – MichaelHajuddah

+0

你運行的是哪個版本的Ruby? – Shoe

回答

11

頂層的方法定義爲私人和Object#respond_to?忽略默認私有方法(你需要傳遞第二個參數以使其識別say_hello):

def say_hello 
    puts 'hi' 
end 

puts respond_to?(:say_hello)     #=> false 
puts respond_to?(:say_hello, :include_private) #=> true 
say_hello 
+0

不是。在Ruby 1.9.3中,頂級方法被定義爲public。 – Shoe

+0

感謝您解決這個問題!我運行了「puts private_methods.sort」,果然,say_hello作爲私有方法出現了。 – MichaelHajuddah

+0

@Jeffrey:從問題的評論:「我使用Ruby 2.0.0」 –

3

這一個挖了一個很大。

如這裏解釋的,http://marakana.com/bookshelf/ruby_tutorial/scope.html接近底部的:「任何類或模塊外定義方法成爲對象私有方法和提供無處不在。」

self,在文件的頂層,是一種特殊的東西,叫'main'。

現在,這裏是有趣的部分。對象否認他們迴應私人方法。

...另一個答案有其餘的信息。

4

在Ruby .respond_to?爲Ruby,而不是Rails的一個檢查方法,它具有的respond_to
注意到一個符號,並返回如果一個對象可以接收方法,否則它返回

你的第一個代碼有在respond_to之前丟失點()? ...當我跑它打印但沒有確實的情況。 ?

語法:object.respond_to(:方法)

- >[1,2,3,5,8,13] .respond_to(:推)