我可以使用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>
答案 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