【问题标题】:what does "class << self" mean in Rails? [duplicate]Rails 中的“class << self”是什么意思? [复制]
【发布时间】:2011-06-06 10:17:48
【问题描述】:

可能的重复:
class << self idiom in Ruby
Can 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)有什么区别?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 1970-01-01
        • 2015-11-04
        • 2012-11-28
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2016-03-28
        相关资源
        最近更新 更多