'回应?'与“已定义?" [英] 'respond_to?' versus 'defined?'

查看:105
本文介绍了'回应?'与“已定义?"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果要检查是否定义了具有给定名称的方法,最好使用respond_to?defined??

If I want to check whether a method with a given name is defined, which is better to use, respond_to?, or defined??

从效率的角度来看,可以使用defined?作为参数,因为defined?是内置关键字,而respond_to?是一种方法,因此前者可能会更快.但是另一方面,在已知要检查的表达式是一种简单方法的情况下,defined?需要解析整个表达式,与使用respond_to?相比,这可能是一个缺点.接受参数作为方法名称.

From the point of view of efficiency, there can be an argument for using defined? because defined? is a built in keyword, whereas respond_to? is a method, and hence the former might be faster. But on the other hand, under the situation that the expression to be checked is known to be a simple method, defined? needs to parse the whole expression, and that may be a drawback as compared to using respond_to?, which just needs to accept the argument as a method name.

哪个更好?除了效率之外,还有其他要考虑的地方吗?

Which is better? Are there points other than efficiency that should be considered?

推荐答案

如果要检查是否定义了具有给定名称的方法,最好使用respond_to?defined??

都不是.使用 Module#method_defined?

Neither. Use Module#method_defined?

这并不是使用更好"的问题:

It's not really a question which is "better" to use: neither the Object#respond_to? method nor the defined? unary prefix operator (despite the name!) checks whether the method is defined: they both check whether the receiver responds to a message, which is a completely different thing.

只有Module#method_defined?会实际检查该方法是否已定义:

Only Module#method_defined? will actually check whether the method is defined:

class Foo
  def method_missing(*) end
  def respond_to_missing?(*) true end
end

foo = Foo.new

defined? foo.bar
#=> 'method'

foo.respond_to?(:bar)
#=> true

Foo.method_defined?(:bar)
#=> false

这篇关于'回应?'与“已定义?"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆