可能重复:
class << self idiom in Ruby
Can someone please explain class << self to me?
我想知道class << self
语句在模型类中的含义是什么?它内部的陈述与外面的陈述有何不同。例如:
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)
之间有什么区别?
答案 0 :(得分: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
类方法适用于类(例如Post),实例方法适用于该类的实例(例如Post.new)
有些人喜欢class << self; code; end;
方式,因为它将所有类级方法保存在一个很好的块中并放在一个地方。
其他人喜欢用self.
为每个方法添加前缀,以明确知道这是一个类方法而不是实例方法。这是一个风格和你如何编码的问题。如果将所有类方法放在像class << self
这样的块中,并且此块足够长,则class << self
行可能不在编辑器视图中,这使得很难知道您在类实例块中。
另一方面,为每个方法添加self.
前缀并将其与实例方法混合也是一个坏主意,在阅读代码时如何知道所有类方法。
为您自己的代码库选择一个您喜欢的习语,但如果您在开源项目上工作或者在其他人的代码上进行协作,请使用他们的代码格式规则。
答案 1 :(得分:4)
这真的是一个Ruby问题。看看“class << self idiom in Ruby”。
答案 2 :(得分:1)
它创建了类方法而不是实例方法。这跟def self.search(q)
一样。这两种方法将被称为:
Post.search(q)
Post.new.search(qq)
答案 3 :(得分:0)
search2
是一个实例方法,而search
是一个类方法。 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
。