对“respond_to?”感到困惑方法

时间:2013-07-27 03:36:13

标签: ruby

编辑:我正在使用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?

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

你的第一个代码在respond_to之前有一个缺失点()? ...当我跑的时候打印 hi ,但没有确认真实情况。

语法:object.respond_to?(:method)

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

答案 2 :(得分:3)

这个需要花费很多时间。

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

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

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

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