【问题标题】:What's the Difference Between These Two Ruby Class Initialization Definitions?这两个 Ruby 类初始化定义有什么区别?
【发布时间】:2011-02-14 16:00:51
【问题描述】:

我正在阅读一本关于 Ruby 的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    self.venue = venue
    self.date = date
  end
end

在本书的前几节中,它会这样定义:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    @date = date
  end
end

在第一个示例中使用 setter 方法与在第二个示例中使用实例变量之间是否有任何功能差异?它们似乎都有效。即使将它们混合在一起也可以:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    self.date = date
  end
end

【问题讨论】:

  • +1 表示并非巧合。

标签: ruby instance-variables


【解决方案1】:

由于attr_accessor已经定义了setter方法,所以除了设置变量什么都不做,所以使用setter方法和直接设置变量没有区别。

使用 setter 方法的唯一好处是,如果您以后应该更改 setter 方法以执行比设置变量更多的操作(例如验证输入或记录某些内容),您的 initialize 方法将受到这些更改的影响无需您更改它。

【讨论】:

  • +1 我发现@venue 不可能(或者很难且未记录)更改通知,只有self.venue。如果有人知道观察基于属性的设置器的方法,请告诉我 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多