Rails HTTParty 的源码

hiveer · 2014年08月18日 · 最后由 hiveer 回复于 2014年08月19日 · 2698 次阅读

lib/httparty.rb

module HTTParty
  module AllowedFormatsDeprecation
    def const_missing(const)
      if const.to_s =~ /AllowedFormats$/
        Kernel.warn("Deprecated: Use HTTParty::Parser::SupportedFormats")
        HTTParty::Parser::SupportedFormats
      else
        super
      end
    end
  end

  extend AllowedFormatsDeprecation

  def self.included(base)
    base.extend ClassMethods
    base.send :include, HTTParty::ModuleInheritableAttributes
    base.send(:mattr_inheritable, :default_options)
    base.send(:mattr_inheritable, :default_cookies)
    base.instance_variable_set("@default_options", {})
    base.instance_variable_set("@default_cookies", CookieHash.new)
  end

  module ClassMethods

    extend AllowedFormatsDeprecation
  ...

代码extend AllowedFormatsDeprecation在这两处的意义分别是什么? 特别是第二处,完全感觉不到有什么用处,求大大们解释下

1 楼 已删除

base.extend ClassMethods , 这个地方估计是个 Bug。 module ClassMethods extend AllowedFormatsDeprecation end; 用于捕获模块内部的常量未定义。

@outman 我已经在 github 上提了一个 issue,有回馈这边会更新

我觉得第一个是防止别人用 HTTParty::AllowedFormats,第二个是防止别人用HTTParty::ClassMethods::AllowedFormats

#4 楼 @kepaning 除了在include HTTParty的时候会有base.extend ClassMethods,还有什么时候我们回去调用HTTParty::ClassMethods::XXXX

#5 楼 @hiveer 嗯,我觉得你是对的,是看不出有什么理由用到。

@outman @kepaning 仔细研究了下,发现源码没有问题 第一个 extend AllowedFormatsDeprecation是为了处理 下面这种情况的 HTTParty::AllowedFormats 的常量调用

第二个extend AllowedFormatsDeprecation是为了处理在ClassMethods里面的方法的常量调用

module ClassMethods
  def test
    AllowedFormats
  end
end

*为了更好的理解上面的解释,还需要特别注意我们在includeextend module的时候,base的 mixing 方法实际上只是对应module方法的一个引用。

pry(main)> ls Test
Out::ClassMethods#methods: test_const

pry(main)> ls Mixing
Mix#methods: b

这也是为什么需要第二个 extend AllowedFormatsDeprecation的原因

#7 楼 @hiveer 我怎么没有看到 ClassMethods 有 test 方法

@kepaning 我上面只是举个例子,test代表了在ClassMethods中定义的实例方法

@hiveer 我也想过这个问题,但是我看不到 ClassMethods 中用了任何的 AllowedFormats。 这是相关的 commit,我还是觉得 ClassMethods 中的这个 extend 是多余的 https://github.com/jnunemaker/httparty/commit/d0d88fecfdd7528fa8bd8d12004f686318f3486c

11 楼 已删除

@kepaning 从代码上看是没有明显的调用,不过可以起到防患未然的作用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号