Ruby on rails Ruby对你的失踪做出回应?叫超级还是不叫超级?

Ruby on rails Ruby对你的失踪做出回应?叫超级还是不叫超级?,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,查看Rails代码库有时会对丢失的代码做出响应?调用super,有时不调用。是否存在不应从respond\u to\u missing调用super的情况?respond\u to\u missing?作为方法的解决方案出现在Ruby 1.9.2版中。以下是一位Ruby core提交人的博客帖子: 但是,调用super的原因是,如果逻辑返回false,则调用将使类层次结构冒泡到对象,该对象返回false。如果您的类是实现了respond\u to\u missing?的类的子类,那么如果您的逻辑

查看Rails代码库有时会对丢失的代码做出响应?调用super,有时不调用。是否存在不应从respond\u to\u missing调用super的情况?

respond\u to\u missing?
作为
方法的解决方案出现在Ruby 1.9.2版中。以下是一位Ruby core提交人的博客帖子:


但是,调用
super
的原因是,如果逻辑返回false,则调用将使类层次结构冒泡到
对象,该对象返回
false
。如果您的类是实现了
respond\u to\u missing?
的类的子类,那么如果您的逻辑返回false,您可能需要调用super。这通常是库代码的问题,而不是应用程序代码的问题。

这取决于类的实现以及您希望从
\respond to \u missing?
中获得的行为。查看
ActiveSupport::TimeWithZone
,它是
Time
的代理包装器。它试图模仿它,欺骗你认为它是时间的一个实例<例如,当通过
时间
时,code>TimeWithZone#is#a?
将响应
true

# Say we're a Time to thwart type checking.
def is_a?(klass)
  klass == ::Time || super
end
alias_method :kind_of?, :is_a?

response\u to\u missing?
应该捕获那些将被
方法\u missing
捕获的案例,因此您必须查看这两种方法
TimeWithZone#method_missing
将缺少的方法委托给
Time
,而不是
super

def method_missing(sym, *args, &block)
  wrap_with_time_zone time.__send__(sym, *args, &block)
rescue NoMethodError => e
  raise e, e.message.sub(time.inspect, inspect), e.backtrace
end
因此,它也可以将
response\u to\u missing?
委托给
Time

# Ensure proxy class responds to all methods that underlying time instance
# responds to.
def respond_to_missing?(sym, include_priv)
  return false if sym.to_sym == :acts_like_date?
  time.respond_to?(sym, include_priv)
end

您是否可以提供一些包含这两种行为的代码片段(当然还有到github的链接)?例如,从respond_到super的调用?但也有哪一个没有。更为典型。一个常见的模式是调用respond_to?在一个被包装的对象上跳过super,例如,当你知道一个超类也实现了
response\u to\u missing?
如果你不确定,调用super是否安全?如果你不确定,调用super是安全的,因为它只会冒泡到
对象上。在respond|u to|u结尾省略了
| super
?一个疏忽还是一个深思熟虑的设计决定?@PiersC对我来说,这看起来像是一个深思熟虑的设计决定。他们希望它返回
时间
将返回的任何内容。就像
方法中没有
super
一样
,他们只是让
Time
知道如何处理它。类中的一致模式是,它试图诱使调用方认为它是时间的实例。就好像这个类是被猴子修补过的,实际上根本没有被修改过一样。@PiersC看看你的另一个例子,
StringInquirer
method\u missing
respond\u to\u missing?
调用
super
,条件相同,例如if
method\u name[-1]!=“?”
。这似乎是一条合理的经验法则,在大多数情况下,
对缺少的方法作出响应?
应该反映缺少的方法。