在ruby中初始化以下内容时,我遇到了一个未定义的局部变量或方法错误:
class Model
attr_accessor :var1, :var2, :state
def initialize (x, y, key)
@var1 = x
@var2 = y
@state = every_state[:key] #this line produces the error
@every_state = {
:A => SateA.new,
:B => StateB.new,
:C => StateC.new,
:D => StateD.new
}
end
def select_state(key)
every_state[:key]
end
end
当我使用类
时model = Model.new(1,2,:A)
发生错误:未定义的局部变量或方法`every_state'
由于我是来自java背景的ruby的新手,我想将一个密钥传递给initialize方法(如here所述),从哈希中选择一个特定的初始状态。
可能是我以错误的方式使用哈希,还是应该完全从initialize方法中取出它并使用另一种方法来设置它?我的另一个想法是我错误地使用了符号。
此外,在initialize方法中对非实例变量进行操作有直接影响吗?例如,我想知道在初始化中将散列声明为实例变量的目的是什么......
非常欢迎任何想法。
答案 0 :(得分:2)
您没有名为“every_state
”的功能。您只有一个实例变量@every_state
。这就是你得到错误的原因。
将every_state
的所有来电替换为@every_state
。您没有函数或局部变量every_state
。您只有一个实例变量@every_state
。
答案 1 :(得分:1)
你有一个拼写错误:: A => SateA.new应该是:A => StateA.new。此外,我会将哈希定义放在初始化方法之外的顶层,否则你将在每次调用new时重新定义它,这是肯定的;你不希望你想做!
答案 2 :(得分:1)
我相信这个实现是最接近Java的实现。
class Model
attr_accessor :var1, :var2, :state
def initialize (x, y, key)
@var1 = x
@var2 = y
@every_state = {
:A => SataeA.new,
:B => StateB.new,
:C => StateC.new,
:D => StateD.new
}
@state = select_state key
end
def select_state(key)
@every_state[key]
end
end