对“respond_to?”方法感到困惑

编辑:我使用的是Ruby 2.0.0版

我在文件example.rb中有以下代码

def say_hello puts 'hi' end puts respond_to?(:say_hello) say_hello 

运行此代码时,输​​出为:

 false hi 

我很困惑为什么为“respond_to”返回false? 当我可以使用那种方法。

“respond_to?” 方法似乎这样工作:

 class Person def say_bye puts 'bye' end end mike = Person.new puts mike.respond_to?(:say_bye) mike.say_bye 

输出是:

 true bye 

有没有人知道为什么“respond_to?” 在第一种情况下返回false?

顶级方法定义为private, 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 

在Ruby .respond_to? Ruby的检查方法,而不是具有respond_to的 Rails
如果对象可以接收该方法,则采用符号并返回true否则返回false

您的第一个代码在respond_to之前有一个缺失点( )? …当我跑它打印喜,但没有确认真实情况。

语法:object.respond_to?(:method)

– > [1,2,3,5,8,13] .respond_to?(:push)

这个花了很多挖掘。

正如这里所解释的, http : //marakana.com/bookshelf/ruby_tutorial/scope.html靠近底部:“在任何类或模块之外定义的方法成为Object上的私有方法,并且随处可用。”

self,在文件的顶层,是一个叫做’main’的特殊东西。

现在这是有趣的部分。 对象否认他们响应私有方法。

…另一个答案有剩下的信息。