“class<< self”在Rails中意味着什么?

时间:2011-01-10 09:30:50

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

  

可能重复:
  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)之间有什么区别?

4 个答案:

答案 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