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
没有特别的理由。