我应该用自己的ruby。 要么 @

这是我的ruby代码

class Demo attr_accessor :lines def initialize(lines) self.lines = lines end end 

在上面的代码我可以使用

  @lines = lines 

大多数情况下,我看到人们在初始化方法中使用@。 在这两者之间有没有一种首选方式?为什么?

使用@lines ,您正在访问实例变量本身。 self.lines实际上是通过类的lines方法; 同样, self.lines = x通过lines=方法。 所以当你想直接访问变量时使用@ ,以及self. 当您想通过该方法访问时。

要直接回答您的问题,通常您希望直接在initialize方法中设置实例变量,但这取决于您的用例。

self.lines是一种方法, @lines是实例变量。 在你的构造函数中,你会想要使用self.lines,但我认为这是有争议的。 真的,这只是一种风格差异。 如果您想深入讨论直接与间接变量访问,请阅读Kent Beck的Smalltalk最佳实践模式一章。

我认为还有一点差别尚待提及。 实例变量@lines只能在类中访问。

 class Foo def initialize @lines = 1 end end foo = Foo.new foo.lines >> NoMethodError: undefined method `lines' for # foo.send(:lines) >> 1 

如果定义attr_accessor:lines,则该类的所有实例都可以访问lines变量:

 class Foo attr_accessor :lines def initialize self.lines = 1 end end foo = Foo.new foo.lines >> 1 

如果您希望所有实例都可以访问您的变量,那么您应该使用attr_accessor。

主要区别在于,如果重新定义lines=来执行除@lines = lines之外的其他@lines = lines

例如,您可以向属性添加validation(例如,如果lines空则引发)。