Rails中"class << self"的含义是什么?

Mel*_*lon 16 ruby ruby-on-rails ruby-on-rails-3

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

我想知道class << self语句在模型类中的含义是什么?它内部的陈述与外面的陈述有何不同.例如:

class Post < ActiveRecord::Base

  class << self
     def search(q)
          # search from DB
     end
  end
   def search2(qq)
         # search from DB
   end
end
Run Code Online (Sandbox Code Playgroud)

什么class << self意思?

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

Adi*_*ghi 27

那是一样的

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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