2012-10-05 36 views
0

我有点困惑的变量的作用域的@,红宝石我写了一个测试程序:为什么我需要设置变量值

class Test 
     attr_reader :tester 
     def initialize(data) 
       @tester = data 
     end 

     def getData 
       tester 
     end 
end 

puts Test.new(11).getData 

现在这个工作得很好,在attr_reader,但我的困惑是因为我定义了attr_reader:tester,那么为什么我不能去tester = data而不是@tester = data,因为当在getData中检索数据时,我只需要写测试器而不是@tester

回答

1

使用attr_reader相当于

class Test 
    def initialize(data) 
    @tester = data 
    end 

    # attr_reader defines this method for you 
    def tester 
    @tester 
    end 

    def getData 
    tester 
    end 
end 

在您的getData方法中使用tester相当于self.tester。如果您使用@tester,则直接访问该变量。当您使用tester时,您可以通过getter方法访问该变量。

+0

但如果我用attr_accessor替换attr_reader:测试者是否意味着我应该只能测试= data? (这不起作用) – Saad

+0

是的,如果你使用'attr_accessor:tester',你也会得到一个setter方法。你可以发表你使用'attr_accessor'和'tester = data'不起作用的例子吗? – Wukerplank

0

attr_reader表示应读取:“将为您创建相应的实例变量getter和setter方法 。”所以首先我们得到数据然后我们设置这些数据。

0

some_name =没有显式接收者的语法被解释为局部变量赋值。为了分配一个实例变量,你必须明确地设置接收器,即使它是self。在这种情况下,self.tester =

相关问题