【问题标题】:Confused about "respond_to?" method对“respond_to”感到困惑?方法
【发布时间】:2013-07-27 11:14:51
【问题描述】:

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

【问题讨论】:

  • 有趣,我只是在 irb 中运行它,它对我有用。您是否尝试过通过调用 self 来更明确? puts self.respond_to?(:say_hello)
  • self.respond_to(:say_hello) 返回 false。
  • 你运行的是什么版本的 Ruby?
  • 如果我定义如下: def self.say_hello;放“嗨”;结尾;把 response_to(:say_hello);那返回真。我一定对这些方法需要定义为类方法还是实例方法感到困惑。有趣的是,我的第一个示例为您返回 true……我使用的是 Ruby 2.0.0,这可能是为什么?

标签: ruby


【解决方案1】:

在 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)

【讨论】:

    【解决方案2】:

    顶级方法被定义为私有,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 1.9.3 中,顶级方法被定义为公共的。
    • 感谢您解决这个问题!我运行了“puts private_methods.sort”,果然,say_hello 显示为私有方法。
    • @Jeffrey:来自问题 cmets:“我正在使用 Ruby 2.0.0”
    • @Jeffrey 我刚试过 1.9.3 - 顶级方法是私有的,就像在 2.0.0 中一样
    【解决方案3】:

    这个需要大量挖掘。

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

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

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

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

    【讨论】:

    • 我会说对象否认它们响应私有方法是正确的,因为默认情况下respond_to? 只考虑公共方法,如其他答案中所述。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 2013-07-19
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多