我应该用自己的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
空则引发)。