【问题标题】:what does "class << self" mean in Rails? [duplicate]Rails 中的“class << self”是什么意思? [复制]
【发布时间】:2011-06-06 10:17:48
【问题描述】:
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-3
【解决方案1】:
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,没有什么特别的原因。
【解决方案2】:
就是这样
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. 并将它们与实例方法混合也是一个坏主意,您如何在阅读代码时知道所有类方法。
为自己的代码库选择一个您喜欢的惯用语,但如果您从事开源项目或协作处理其他人的代码,请使用他们的代码格式规则。
【解决方案3】:
它创建类方法而不是实例方法。与def self.search(q) 相同。这两种方法的调用方式如下:
Post.search(q)
Post.new.search(qq)