代码之家  ›  专栏  ›  技术社区  ›  Piers C

Ruby respond_to_缺失?是否呼叫super?

  •  4
  • Piers C  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   m. simon borg    7 年前

    #respond_to_missing? ActiveSupport::TimeWithZone ,它是的代理包装器 Time .它试图模仿它,欺骗你认为它是 . 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?
    

    respond_to_missing? 应该抓住可能被 method_missing TimeWithZone#method_missing 时间 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
    

    因此,授权是有道理的 对缺失的响应?

    # 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
    
        2
  •  1
  •   DiegoSalazar    7 年前

    respond_to_missing? 出现在Ruby 1.9.2版本中,作为 method 方法以下是一位Ruby core提交者的博客帖子: http://blog.marc-andre.ca/2010/11/15/methodmissing-politely/

    super 但是,如果逻辑返回false,则调用将在类层次结构中冒泡到 Object false 。如果您的类是实现 对缺失的响应? 如果逻辑返回false,则需要调用super。这通常是库代码的问题,而不是应用程序代码的问题。