undefined局部变量ruby

时间:2013-05-06 07:36:22

标签: ruby class variables scope

这是我的班级:

class Money
  def initialize(dollars, quarters, dimes, nickels, pennies)
    @coins = [ {:coin => dollars,  :price => 100},
               {:coin => quarters, :price => 25},
               {:coin => dimes,    :price => 10},
               {:coin => nickels,  :price => 5},
               {:coin => pennies,  :price => 1} ]
  end
  def count
    total = 0.00
    coins.each do |coin|
      next if coin[:price] == 0
      total += coin[:coin] * coin[:price]
    end
    total / 100
  end
end

我正在测试它:

money = Money.new( 5, 1, 2, 1, 0 )
puts "$%.2f" % money.count

我收到错误:

money.rb:12:in `count': undefined local variable or method `coins' for #<Money:0x2567310> (NameError)
    from money.rb:34:in `<main>'

指向行coins.each do |coin|并且对我没有意义,因为我认为,如果我使用@为变量添加前缀,我可以在整个对象的方法中使用它(它不会转移到另一个对象)。

我使用不同的代码来完成这项工作:

@dollar = dollar
@quarter = quarter
...

对于我的initialize方法(我的count方法完全不同),但现在我正在尝试创建一个哈希表数组,以便我可以重构我的count方法。 / p>

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

count()方法中,请将coins称为@coins。 否则,您创建的变量仅适用于您的方法,而不是引用您在initialize()

中创建的实例变量

所以它写着:

def count
    total = 0.00
    @coins.each do |coin|
        next if coin[:price] == 0
        total += coin[:coin] * coin[:price]
    end
    total / 100
end

答案 1 :(得分:2)

如果您创建实例变量(使用@),则必须始终使用@引用它。

def count
  total = 0.00
  @coins.each do |coin| #Here was your error
    next if coin[:price] == 0
    total += coin[:coin] * coin[:price]
  end
  total / 100
end