【问题标题】:attr vs attr_accessorattr 与 attr_accessor
【发布时间】:2012-12-07 03:21:59
【问题描述】:

在 Ruby 中,实例变量有四种不同的 getter 和 setter 方法,attrattr_readerattr_writerattr_accessor。问题是,在Ruby中是attr :dilithium,和attr_reader :dilithium一样,和attr_accessor :dilithium一样,如果传递了额外的参数true?也就是说是

class Enterprise
  attr :dilithium, true

相同
class Enterprise
  attr_accessor :dilithium

attrattr_accessor 这两个函数或多或少是多余的?

【问题讨论】:

    标签: ruby oop


    【解决方案1】:

    一个区别是attr_accessor 和朋友更清晰,attr 的可选布尔参数现在是deprecated。除此之外,attr 没有文档这一事实,并没有真正的区别。

    【讨论】:

    • attr 确实有文档,至少在 2.3.0 中。它只是attr_reader 的别名。虽然,文档的组织方式很差,所以也许可以改进以使事情更清晰。
    【解决方案2】:

    在 Ruby 1.8 中,attr 只能定义一个属性,并带有一个可选的 true 来创建一个 setter 。在 1.9 中,它的行为类似于 attr_reader:它允许多个属性。正如@Linuxios 所说,不推荐使用可选的布尔值。

    【讨论】:

      【解决方案3】:

      如果您查看 Ruby 2.3.0 中的 C 代码,您会发现 attrattr_reader 实际上在做同样的事情(除了已弃用的代码路径)。它们本质上是等价的功能。

      对我来说,主要区别是:

      attr 更容易写下来,因为它更短。我也喜欢它在函数式/不可变编程上下文中的感觉(在这些上下文中,attr_writerattr_accessor 是无关紧要的,因此使用 attr_reader 感觉很冗长和多余)。

      attr 具有多个实例变量,因此很难记录,除非在非常特殊的情况下,例如

      # The coordinates in WGS84.
      attr :x, :y
      
      # The location name.
      attr :name
      
      # The popularity of the location.
      attr :popularity
      

      如果:name:popularity 在同一行上attr :name, :popularity,则单独记录它们会更加困难。

      除此之外,这归结为个人喜好。实际上没有性能差异或任何其他差异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2011-10-18
        • 2012-01-08
        • 2012-10-26
        相关资源
        最近更新 更多