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查询(例如,使用where
或order
等)。 这是因为这些方法中的每一个都返回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:什么更好?