Ruby on Rails 3中的类方法 – 我完全迷失了!

背景在这里 。

在上面的链接中,给出了以下示例:

class < author.id) end end 

除了那个对我这样的初学者来说很陌生的语法 – 我一直认为用def self.my_class_method定义了类方法 – 在哪里可以找到Ruby on Rails中类方法的文档?

据我所知,类方法总是在类本身上调用( MyClass.my_class_method ),但是如果Rails中的类方法是可链接的,那么好像其他东西必须在这里进行!

编辑:

我想通过对类方法的语法做出评论来欺骗我。 我真的在问Rails如何使类方法可链接 – 我理解方法链如何工作,但不知道Rails如何允许链接类方法而不在链中的每个“链接”之后实际返回类对象本身。

Ruby中的类方法实际上只是单例类的成员,而class << self涉及直接打开单例类并添加它,无需在每个方法定义中声明它。

这篇关于Ruby singletons的文章做了很好的解释。

至于类方法是可链接的,这不是特定于类方法的东西,第二个方法调用只是在从第一个返回的对象上调用。 例如:

 bar = foo.do_something.do_more 

相当于:

 tmp = foo.do_something bar = tmp.do_more 

在Rails中,这种可链接性最常用于构建SQL查询(例如,使用whereorder等)。 这是因为这些方法中的每一个都返回ActiveRecord关系 。

原因

  foo.scoped.my_foo_class_method 

作品是因为ActiveRecord::Relation#method_missing做了以下事情:

 elsif @klass.respond_to?(method) scoping { @klass.send(method, *args, &block) } 

哪个检查ActiveRecord类是否响应被调用的方法,如果是,则调用它。

使用类<< self也是另一种定义方法的方法,这样您就不必为每个定义为类方法的方法调用“def self.my_method”或“def MyClass.my_method”。 而不是打电话

   def self.my_method1
  结束

   def self.my_method2
  结束
class级“自我
   def my_method1
  结束

   def my_method2
  结束
结束

干杯!

以下两位代码是等效的。

使用self.method

 class Hello def self.world puts "Hello, World!" end end 

使用class << self

 class Hello class << self def world puts "Hello, World!" end end end 

唯一的区别是可读性,以及重构的简易性。 在元编程时经常使用class << self技术class << self这一class << self

还有另一个线程可以解释这一点。 class << self vs self.method with Ruby:什么更好?