Ruby中的实例变量
Ruby 1.9 我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须仅在某个Ruby中的实例变量,ruby,Ruby,Ruby 1.9 我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须仅在某个类中使用,并且在类外根本无法访问,因此attr\u访问器或attr\u阅读器不是我需要的 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
类中使用,并且在类外根本无法访问,因此attr\u访问器
或attr\u阅读器
不是我需要的
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 initialize
@my_var = 'some value'
end
# etc...
end
是的,初始化
是正确的方法
但您也可以:
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
是的,初始化
是正确的方法
但您也可以:
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
它们只能在方法(构造函数)initialize()
中初始化?这是我的问题。它们可以在任何实例方法中初始化,但是initialize
是任何给定实例调用的第一个方法,因此它是执行此操作的最佳位置。为什么不能在任何方法中初始化它<代码>类MyClass@my_var='some value';end
?无论何时创建实例变量,它都会与self
的当前值相关联,在任何方法之外,如果将与MyClass
类对象相关联,则在方法内部self
指的是MyClass
的当前实例。因此,如果在方法之外进行初始化,它将与类本身相关联,而不是与该类的特定实例相关联。它们只能在方法(构造函数)initialize()
中进行初始化?这是我的问题。它们可以在任何实例方法中初始化,但是initialize
是任何给定实例调用的第一个方法,因此它是执行此操作的最佳位置。为什么不能在任何方法中初始化它<代码>类MyClass@my_var='some value';end?无论何时创建实例变量,它都会与self
的当前值相关联,在任何方法之外,如果将与MyClass
类对象相关联,则在方法内部self
指的是MyClass
的当前实例。因此,如果在方法外部初始化,它将与类本身关联,而不是与该类的特定实例关联。这是惰性定义模式。这是惰性定义模式。