ruby - “respond_to ?' versus '定义了吗?”

标签 ruby methods metaprogramming

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

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

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

最佳答案

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



两者都不。使用 Module#method_defined?

并不是真正使用“更好”的问题: Object#respond_to? 方法或defined?一元前缀运算符(尽管有名称!)都不会检查方法是否是定义的:它们都检查接收方是否响应一条消息,这是完全不同的事情。

实际上,只有Module#method_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

关于ruby - “respond_to ?' versus '定义了吗?”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44107544/

相关文章:

javascript - 关注点、装饰者、演示者、服务对象、帮助者 - 帮助我理解它们

java - 如何在BroadcastReceiver和main方法之间传递信息

python - 通过 getattr 访问方法

ruby - 为什么 Ruby Builder 的 XmlMarkup 使用与 groovys 的 NodeBuilder 不同的语法

ruby - 在 Ruby 中取消定义变量

ruby-on-rails - Rails 4 从迁移索引中删除迁移 ID

Ruby - net/http - 跟随重定向

python - 为什么需要在 Python 方法中显式使用 "self"参数?

python - 动态继承的设计模式

ruby-on-rails - 使用 ERB 打印数组元素