这两个Ruby类初始化定义有什么区别?

mic*_*ael 5 ruby instance-variables

我正在编写一本关于Ruby的书,并且作者使用了一种稍微不同的形式来编写类初始化定义,而不是在本书的前几节中.它看起来像这样:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    self.venue = venue
    self.date = date
  end
end
Run Code Online (Sandbox Code Playgroud)

在本书的前几节中,它将被定义为:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    @date = date
  end
end
Run Code Online (Sandbox Code Playgroud)

在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是否存在任何功能差异?他们似乎都工作.即使将它们混合起作用:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    self.date = date
  end
end
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 9

由于setter方法已被定义attr_accessor,因此只设置变量,因此使用setter方法和直接设置变量之间没有区别.

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