代码之家  ›  专栏  ›  技术社区  ›  Daniel Vandersluis

定义Ruby类方法的方法有区别吗?

  •  2
  • Daniel Vandersluis  · 技术社区  · 15 年前

    给出了以下两种在Ruby中定义类方法的方法:

    class Foo
      class << self
        def bar
          # ...
        end
      end
    
      def self.baz
        # ...
      end
    end
    

    这两者有区别吗?一个比另一个更好吗?

    4 回复  |  直到 15 年前
        1
  •  3
  •   molf    15 年前

    简而言之:不,不。

    这取决于个人喜好。如果定义了许多类方法,第一个版本将保存您键入的内容。如果您不喜欢第一个的模糊语法,第二个可能更好。

        2
  •  3
  •   Jörg W Mittag    15 年前

    只是为了澄清术语:Ruby中没有“类方法”这样的东西。你要做的是定义一个 单件方法 对象 那是班级 Foo (记住,类也是对象,就像其他对象一样)。反过来,单例方法也不真正存在,它们只是 本征类 (通常称为 Foo′ )对象,在本例中,它也是类的元类 .

    迷惑了吗?-)

    基本上,这样做没有区别:

    foo = Object.new
    class << foo
      def bar
        # ...
      end
    end
    
    def foo.baz
      # ...
    end
    

    而这:

    class Foo
      class << self
        def bar
          # ...
        end
      end
    
      def self.baz
        # ...
      end
    end
    

    因为在类定义中, self 绑定到类对象(在本例中 ,相当于:

    class Foo
      class << Foo
        def bar
          # ...
        end
      end
    
      def Foo.baz
        # ...
      end
    end
    

    依次相当于:

    Foo = Class.new
    class << Foo
      def bar
        # ...
      end
    end
    
    def Foo.baz
      # ...
    end
    

    正如你所看到的,这与我的第一个例子几乎完全相同。这表明类方法上的单例方法和其他任何类型的对象上的单例方法都没有区别,因此在Ruby中谈论“类方法”是没有意义的。

    您还可以看到这两个符号如何与单例方法和特征类的概念相关:

    def foo.baz
      # ...
    end
    

    说“添加singleton方法 baz 对客体 foo “和

    class << foo
      def bar
        # ...
      end
    end
    

    “打开物体的特征分类 然后添加实例方法 bar 到本征类”。但是,正如我们之前建立的,对象的单例方法和对象的本征类的实例方法实际上是相同的。这就是为什么这两个符号的行为不一样是不合理的。

        3
  •  0
  •   Chuck    15 年前

    正如莫尔夫所说,没有有效的区别。但是,在我看来,第二个更容易被忽略。 class<<self 并且认为您仍在研究实例方法。我只喜欢用 等级<<self 当我需要更动态的行为时,例如 attr_accessor 类本身的属性。

        4
  •  0
  •   Ijonas    15 年前

    选项1。如果你之间有很多行代码,会给你带来麻烦的 class << self 以及相应的 end . 如果您没有注意到在 等级<<self 块,您可能认为它只是一个实例方法。

    选项2。对于未经训练的红宝石眼来说,更容易打字、表达和理解。

    他们的最终结果和其他人已经指出的一样。