Ruby 1.9
我突然意识到我不了解如何在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
那么,第二种方法是正确的吗?
答案 0 :(得分:3)
每个类都有一个initialize()
方法,其作用类似于其他语言的构造函数,实例变量应该在那里初始化:
class MyClass
def initialize
@my_var = 'some value'
end
# etc...
end
答案 1 :(得分: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