Ruby中的实例变量
问题描述:
Ruby 1.9Ruby中的实例变量
我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须使用只有在一定class
并且根本不能从一个类访问,所以attr_accessor
或attr_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
那么,是第二种方法是正确的?
答
每一类有一个initialize()
方法,它的作用类似于其他语言的构造函数,实例变量应该有初始化:
class MyClass
def initialize
@my_var = 'some value'
end
# etc...
end
答
是,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
他们只能在方法(构造器)来初始化'初始化()'?这是我的问题。 – Alexandre 2012-08-02 14:23:39
它们可以在任何实例方法中初始化,但'initialize'是任何给定实例调用的第一个方法,所以它是最好的方法。 – tadman 2012-08-02 14:26:53
为什么不能通过任何方法初始化? 'class MyClass @my_var ='some value'; end'? – Alexandre 2012-08-02 14:45:52