2011-01-10 85 views
12

可能重复:
class << self idiom in Ruby
Can someone please explain class << self to me?Rails中的“class << self”是什么意思?

我想知道是什么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)之间的区别是什么?

+0

search2是一个非常差的方法名称。 – 2011-01-10 12:36:13

回答

22

这是一样的

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 

类方法的类(如邮政)合作,实例方法适用于(如邮政该类的实例。新)

有人喜欢class << self; code; end;方式,因为它保持在一个不错的块和一个地方的所有一流水平的方法。

有些人则喜欢前缀的每一个法self.明确地知道这是一个类的方法不是一个实例方法。这是一个风格问题和你如何编码。如果将所有类的方法放在class << self这样的块中,并且该块足够长,那么class << self行可能不在编辑器视图中,这使得难以知道您处于类实例块中。另一方面,将每个方法前缀为self.并将它们与实例方法混合在一起也是一个坏主意,在阅读代码时如何知道所有类方法。

选择您希望为自己的代码库,但如果你在一个开源项目工作,或者你在别人的代码进行合作,利用他们的代码格式规则的成语。

1

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

Post.search(q) 
Post.new.search(qq) 
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