Rails 中的“class << self”是啥意思? [复制]
Posted
技术标签:
【中文标题】Rails 中的“class << self”是啥意思? [复制]【英文标题】:what does "class << self" mean in Rails? [duplicate]Rails 中的“class << self”是什么意思? [复制] 【发布时间】:2011-06-06 10:17:48 【问题描述】:可能的重复:class << self idiom in RubyCan 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)
有什么区别?
【问题讨论】:
search2 是一个非常糟糕的方法名称。 还有 Rails class << self 和 Difference between 'self.method_name' and 'class << self' in Ruby 和 Can someone please explain class << self to me? 的副本。请在发布问题前进行搜索。 【参考方案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)
【讨论】:
以上是关于Rails 中的“class << self”是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails
努力优化 Rails WHERE NOT IN 在 Rails 中的查询