Ruby on rails Ruby对你的失踪做出回应?叫超级还是不叫超级?
查看Rails代码库有时会对丢失的代码做出响应?调用super,有时不调用。是否存在不应从respond\u to\u missing调用super的情况?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?的类的子类,那么如果您的逻辑
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
,条件相同,例如ifmethod\u name[-1]!=“?”
。这似乎是一条合理的经验法则,在大多数情况下,对缺少的方法作出响应?
应该反映缺少的方法。