关于rails框架代码的问题

时间:2010-05-26 19:54:03

标签: ruby-on-rails ruby

我注意到rails框架中的代码在整个地方都使用了以下约定:

class SomeClass
  class << self
     def some function
     end
  end
end

而不是

class SomeClass
end

def SomeClass.function
end

class SomeClass
  def self.somefunction
  end
end

这种设计选择的原因是什么?他们似乎都完成了同样的事情

3 个答案:

答案 0 :(得分:1)

class << self选择的一个优点是它允许您轻松定义私有类方法:

class SomeClass
  class << self
    def a_public_method
      "This is a public class method"
    end

    private
    def a_private_method
      "This is a private class method"
    end
  end
end

否则,您必须使用private_class_method,即:

class SomeClass
  def self.a_public_method
    "This is a public class method"
  end

  def self.a_private_method
    "This will be a private class method"
  end
  private_class_method :a_private_method
end

答案 1 :(得分:1)

它们实际上是不同的。第一个示例中的内部类声明实际上引用了SomeClass的本征类。特征类允许您为类定义特定于实例的行为。因此,某些函数方法实际上并不属于该类,而是属于该类的实例。

至于为什么使用它,如果你想扩展现有类的功能而不污染它的方法命名空间,我会发现它很有用。

答案 2 :(得分:1)

戴夫·托马斯有一个很好的元编程截屏系列,它涉及这些高级主题。我相信第二集讲的是关于课程&lt;&lt;自。可以在http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming

找到截屏视频