编辑:我正在使用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?
答案 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'。
现在这是有趣的部分。对象否认他们对私有方法做出回应。
......另一个答案有剩下的信息。