2012-08-02 145 views
0

Ruby 1.9Ruby中的实例变量

我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须使用只有在一定class并且根本不能从一个类访问,所以attr_accessorattr_reader是不是我所需要的。

class MyClass 

    #how do I initialize it? 
    @my_var = 'some value' 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 
    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #empty 
a.method2 #empty 

所以,我发现还有另一种方式来做到这一点

class MyClass 

    #is this the only way to do it? 
    def initialize 
    @my_var = 555 
    end 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 

    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #555; it's ok 
a.method2 #555; it's ok 

那么,是第二种方法是正确的?

回答

3

每一类有一个initialize()方法,它的作用类似于其他语言的构造函数,实例变量应该有初始化:

class MyClass 

    def initialize 
    @my_var = 'some value' 
    end 

    # etc... 
end 
+0

他们只能在方法(构造器)来初始化'初始化()'?这是我的问题。 – Alexandre 2012-08-02 14:23:39

+0

它们可以在任何实例方法中初始化,但'initialize'是任何给定实例调用的第一个方法,所以它是最好的方法。 – tadman 2012-08-02 14:26:53

+0

为什么不能通过任何方法初始化? 'class MyClass @my_var ='some value'; end'? – Alexandre 2012-08-02 14:45:52

2

是,initialize才是正道。

但你也可以做:

class MyClass 

    def method1 
    #I need to do something with @my_var 
    puts @my_var ||= 555 
    end 

    def method2=(x) 
    #I need to do something with @my_var 
    puts @my_var = x 
    end 
end 

#Test: 
x = MyClass.new 
x.method1  #555 
x.method2= 44 #44 
x.method1  #44 

method1被称为第一次,它初始化变量。

编辑: 预期它不工作,当您分配nil

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #again 555 

这个版本更好地工作:

class MyClass 

    def method1 
    @my_var = 555 unless defined? @my_var 
    puts @my_var 
    end 

    def method2=(x) 
    puts @my_var = x 
    end 
end 

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #keeps nil 
+0

这是懒惰的定义模式。 – tadman 2012-08-02 14:28:25