【问题标题】:Ruby Class Method SetupRuby 类方法设置
【发布时间】:2014-10-31 19:46:36
【问题描述】:

我正在浏览 Ruby Koans Ruby Koans,我在“about_class_methods.rb”中讨论设置类方法的地方,而 Koans 讨论了三种方式。

编写类方法的两种主要方式是:

1:

class Demo (define/open class)
  def self.method
end

2:

  class << self
    def class_methods
    end
  end

koans 还谈到了第三种方法,我从未见过(我记得):

def Demo.class_method_third_way
end

Q1 这第三种方式对我来说实际上比其他任何方式都更清晰。没有人用它是不是有我不明白的原因?

Q2 为什么我错误地认为 2 的语法应该是“self

一如既往,感谢您的帮助和耐心!

【问题讨论】:

    标签: ruby class methods syntax


    【解决方案1】:

    在(早期)开发中,随着洞察力的增长,类被重命名(不是Person,而是Employee,不是Job,而是一个或多个Roles等)如果类名是硬编码的,这种重命名很容易出错在类本身中。

    【讨论】:

    • 哇,Steenslag 的有趣见解!
    • 这个答案特别好,因为 OP 正在询问 ruby​​ koans。 :) 这是一个非常禅宗的答案。
    【解决方案2】:

    在类主体中,self 准确地引用了正在定义的类对象。这就是def self.some_methoddef Demo.some_method 工作方式相同的原因。

    class Demo
      puts self.object_id == Demo.object_id
    end
    #=> true
    

    class &lt;&lt; some_obj 是访问some_obj 的单例类的语法。参考Ruby doc

    对象的单例类(也称为元类或特征类)是一个仅包含该实例的方法的类。您可以使用class &lt;&lt; object 访问对象的单例类...大多数情况下,您会看到像这样访问的单例类:

    class C
      class << self
        # ...
      end
      # or
      class << C
      end
    end
    

    【讨论】:

    • 谢谢阿里。我读了链接。我太菜鸟了,不能有这么大的帮助。我还发现了这个:devalot.com/articles/2008/09/ruby-singleton,它涵盖了一些相同的领域。在回答我的 Q1 时,我认为您没有发表评论(这很好)并且在回答 Q2 时,我认为您正在扩展单例概念。也就是说,为什么不经常使用 Demo.class_method 呢?有什么我想念的吗?
    • @codenoob 如果你使用class &lt;&lt; self; end,当你重构你的类名时,你不需要修改这个语句块中的名字。
    猜你喜欢
    • 2012-01-07
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多