Ruby初始化方法:使用散列键设置实例变量

时间:2009-09-27 20:06:51

标签: ruby hash initialization

在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方法中对非实例变量进行操作有直接影响吗?例如,我想知道在初始化中将散列声明为实例变量的目的是什么......

非常欢迎任何想法。

3 个答案:

答案 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