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 &lt;&lt; self 语句在模型类中是什么意思?它内部的语句与外部的语句有何不同。例如:

class Post < ActiveRecord::Base

  class << self
     def search(q)
          # search from DB
     end
  end
   def search2(qq)
         # search from DB
   end
end

class &lt;&lt; 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 &lt;&lt; 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 &lt;&lt; self; code; end; 方式,因为它将所有类级别的方法保存在一个不错的块中和一个地方。

其他人喜欢在每个方法前加上self.,以明确知道这是类方法而不是实例方法。这是风格和编码方式的问题。如果您将所有类方法放在像class &lt;&lt; self 这样的块中,并且该块足够长,则class &lt;&lt; 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 3 中的 Restful API

努力优化 Rails WHERE NOT IN 在 Rails 中的查询

Rails:Rails 中的 POST 422(不可处理实体)?由于路线或控制器?

如何过滤rails中的参数?

Rails:如何为 Rails activerecord 模型中的属性创建默认值? [复制]