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

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

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方法与在第二个示例中使用实例变量之间是否存在任何function差异? 他们似乎都工作。 即使将它们混合起作用:

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

由于setter方法已由attr_accessor定义,因此除了设置变量之外什么都不attr_accessor ,因此使用setter方法和直接设置变量之间没有区别。

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