Ruby 中的类方法实际上只是单例类的成员,并且执行class << self
涉及直接打开单例类并添加到其中,从而无需在每个方法定义中声明它。
This 关于 Ruby 单例的文章 http://www.contextualdevelopment.com/articles/2008/ruby-singleton解释得很好。
至于类方法是可链接的,这不是类方法特有的,第二个方法调用只是在第一个方法返回的对象上调用。例如:
bar = foo.do_something.do_more
相当于:
tmp = foo.do_something
bar = tmp.do_more
在 Rails 中,这种可链接性最常用于构建 SQL 查询(例如,使用where
or order
, ETC。)。这是因为每个方法都返回一个ActiveRecord关系 http://api.rubyonrails.org/classes/ActiveRecord/Relation.html.
原因
foo.scoped.my_foo_class_method
作品是因为ActiveRecord::Relation#method_missing https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L393执行以下操作:
elsif @klass.respond_to?(method)
scoping { @klass.send(method, *args, &block) }
它检查 ActiveRecord 类是否响应所调用的方法,如果是,则调用该方法。