我应该用自己的红宝石。要么 @

时间:2011-03-11 16:45:12

标签: ruby

这是我的红宝石代码

class Demo
  attr_accessor :lines

  def initialize(lines)
    self.lines = lines
  end
end

在上面的代码中我可以使用

    @lines = lines

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

4 个答案:

答案 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为空,则进行提升)。