12

编辑:我使用的是 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?

4

3 回答 3

20

顶级方法被定义为私有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
于 2013-07-27T03:52:09.970 回答
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?(:push)

于 2013-12-30T04:06:38.483 回答
3

这个花了很多时间挖掘。

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

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

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

...另一个答案包含其余信息。

于 2013-07-27T04:06:21.547 回答