Rails中“class << self”的意思是什么?

可能重复:
在Ruby中的类<< self idiom
有人可以向我解释一下“自我”吗?

我想知道class << self statement在模型类中意味着什么? 它内部的陈述与外面的陈述有何不同。 例如:

 class Post < ActiveRecord::Base class << self def search(q) # search from DB end end def search2(qq) # search from DB end end 

class << self意味着什么?

方法search(q)search2(qq)之间有什么区别?

那是一样的

 class Post < ActiveRecord::Base def self.search(q) # Class Level Method # search from DB end def search2(qq) # Instance Level Method # search from DB end end 

类方法适用于类(例如Post),实例方法适用于该类的实例(例如Post.new)

有些人喜欢class << self; code; end; class << self; code; end; 因为它将所有类级别的方法保存在一个很好的块中并放在一个地方。

其他人喜欢用self.为每个方法加上前缀self. 明确知道这是一个类方法而不是实例方法。 这是一个风格和你如何编码的问题。 如果将所有类方法放在类似class << self的块中,并且此块足够长,则class << self line可能超出编辑器视图,这使得很难知道您在类实例块中。

另一方面,为每个方法添加self.前缀self. 并且将它们与实例方法混合也是一个坏主意,在阅读代码时如何知道所有类方法。

选择一个您喜欢自己的代码库的成语,但如果您在开源项目上工作或者在其他人的代码上进行协作,请使用他们的代码格式规则。

这真的是一个Ruby问题。 看看“ Ruby中的类<< self idiom ”。

它创建类方法而不是实例方法。 这与def self.search(q) 。 这两种方法将被称为:

 Post.search(q) Post.new.search(qq) 

search2是一个实例方法,而search是一个类方法。 使用class << self语法class << self可以将下面的类方法分组。 在Ruby中有三种定义类方法的方法:

 class MyClass def self.method # do sth. end def MyClass.method2 # do sth. end class << self def method3 # do sth. end def another_class_method # do sth. end end end 

类方法在类上调用,而不是在实例上调用。 个人偏好你想要使用的三个成语中的哪一个。 我更喜欢def self.method没有特别的理由。