来自顶级脚本的respond_to?()

时间:2015-04-23 01:48:31

标签: ruby

我可以使用irb中的主要对象的response_to?():

irb(main):001:0> def foo
irb(main):002:1>   "hi"
irb(main):003:1> end
=> nil
irb(main):004:0> respond_to?(:foo)
=> true
irb(main):005:0> self
=> main

但是当我把它放到一个脚本中时,它似乎并不像我期望的那样工作:

$ cat test.rb
#! /usr/local/bin/ruby
def foo
  "hi"
end
puts respond_to?(:foo)
puts self

$ ./test.rb
false
main

这里发生了什么?

编辑:

irb行为适用于1.9.3,但不适用于2.2.0。但无论如何,是否可以从脚本中使用respond_to?()?

作为替代方案,我可以通过调用NoMethodError来捕获send(),但这也会从有效方法中捕获此类异常,这会使错误处理有点复杂。 / p>

1 个答案:

答案 0 :(得分:3)

在顶级定义的方法是Object的私有方法,默认情况下respond_to?仅对公共方法返回true。要检查private和protected方法,请将include_all参数设置为true:

def foo
  "hi"
end 

puts respond_to?(:foo, true)
puts self

现在运行脚本时,respond_to?(:foo, true)应该返回true:

$ ./test.rb
true
main
相关问题