这是我的红宝石代码
class Demo
attr_accessor :lines
def initialize(lines)
self.lines = lines
end
end
在上面的代码中我可以使用
@lines = lines
大多数情况下,我看到人们在初始化方法中使用@。在这两者之间是否有一种首选方式?为什么?
答案 0 :(得分:40)
使用@lines
时,您正在访问实例变量本身。 self.lines
实际上通过了该类的lines
方法;同样,self.lines = x
通过lines=
方法。因此,当您想要直接访问变量时使用@
,当您想通过该方法访问时使用self.
。
要直接回答您的问题,通常您希望直接在initialize
方法中设置实例变量,但这取决于您的用例。
答案 1 :(得分:5)
self.lines
是一种方法,@lines
是实例变量。在你的构造函数中,你会想要使用self.lines,但我认为这是有争议的。这真的只是一种风格差异。如果您想深入讨论直接与间接变量访问,请阅读Kent Beck的Smalltalk最佳实践模式一章。
答案 2 :(得分:2)
我认为还有一点差别尚待提及。实例变量@lines只能在类中访问。
class Foo
def initialize
@lines = 1
end
end
foo = Foo.new
foo.lines
>> NoMethodError: undefined method `lines' for #<Foo:0x1017cfb80 @lines=0>
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。
答案 3 :(得分:0)
主要区别在于,如果您重新定义lines=
以执行@lines = lines
以外的操作。
例如,您可以向属性添加验证(例如,如果lines
为空,则进行提升)。