关于ruby:“class << self”在Rails中意味着什么?

what does “class << self” mean in Rails?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
class << self idiom in Ruby Can someone please explain class << self to me?

我想知道class << self语句在模型类中的含义是什么? 它内部的陈述与外面的陈述有何不同。 例如:

1
2
3
4
5
6
7
8
9
10
11
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)之间有什么区别?


那是一样的

1
2
3
4
5
6
7
8
9
10
11
12
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.前缀并将它们与实例方法混合也是一个坏主意,在读取代码时如何知道所有类方法。

选择一个您喜欢自己的代码库的成语,但如果您在开源项目上工作或者在其他人的代码上进行协作,请使用他们的代码格式规则。


这真的是一个Ruby问题。看看"Ruby中的类<< self idiom"。


它创建类方法而不是实例方法。这和做def self.search(q)一样。这两种方法将被称为:

1
2
Post.search(q)
Post.new.search(qq)

search2是实例方法,而search是类方法。 class << self语法使您可以对下面的类方法进行分组。在Ruby中有三种定义类方法的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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