背景here。
在上面的链接中,给出了以下示例:
class << self
def by_author(author)
where(:author_id => author.id)
end
end
除了那个语法对我这样的初学者来说很陌生 - 我一直认为类方法是用def self.my_class_method
定义的 - 在哪里可以找到关于Ruby on Rails中类方法的文档?
据我所知,类方法总是在类本身上调用(MyClass.my_class_method
),但是如果Rails中的类方法是可链接的,那么似乎必须在这里进行其他操作!
修改
我想通过对类方法的语法做出评论来欺骗我。我真的在问Rails如何使类方法可链接 - 我理解方法链如何工作,但不知道Rails如何允许你链接类方法而不实际返回类在链中的每个“链接”之后对象本身。
答案 0 :(得分:5)
Ruby中的类方法实际上只是单例类的成员,并且执行class << self
涉及直接打开单例类并添加它,从而无需在每个方法定义中声明它。
这个article on Ruby singletons做得很好解释。
对于可链接的类方法,这不是特定于类方法的东西,第二个方法调用只是在从第一个返回的对象上调用。例如:
bar = foo.do_something.do_more
相当于:
tmp = foo.do_something
bar = tmp.do_more
在Rails中,这种可链接性最常用于构建SQL查询(例如,使用where
或order
等)。这是因为这些方法中的每一个都返回ActiveRecord Relation。
原因
foo.scoped.my_foo_class_method
作品是因为ActiveRecord::Relation#method_missing
执行以下操作:
elsif @klass.respond_to?(method)
scoping { @klass.send(method, *args, &block) }
检查ActiveRecord类是否响应所调用的方法,如果是,则调用该方法。
答案 1 :(得分:4)
有班级&lt;&lt; self也是定义方法的另一种方法,因此您不必为定义为类方法的每个方法调用“def self.my_method”或“def MyClass.my_method”。而不是打电话
def self.my_method1 end def self.my_method2 end
class << self def my_method1 end def my_method2 end end
干杯!
答案 2 :(得分:2)
以下两位代码是等效的。
使用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 vs self.method with Ruby: what's better?