nil:NilClass(NoMethodError)错误

时间:2011-08-22 14:40:40

标签: ruby

当我运行我的代码时,我得到以下内容:

cities.rb:70:in `sell_is_valid': undefined method `[]' for nil:NilClass (NoMethodError)
    from cities.rb:103
    from cities.rb:79:in `each'
    from cities.rb:79

以下是代码:

def sell_is_valid(num, type)
    puts "The most loads of #{type} you can sell is #{@train[num]}." #Line 66
    puts "How many #{type} would you like to sell?"
    prompt; value = gets.chomp.to_i
    if @train[num] <= value
        @wallet = @wallet + (value * @cities[@current_location][num]) #Line 70
        @storage = @storage + value
        @train[num] = @train[num] - value
    else
        puts "You're trying to buy too much!"
    end
end

那么我所做的就是在第70行做了一次投注。

puts @wallet
puts @cities[@current_location][num]

这次在puts @cities [@current_location] [num]行上出现相同的错误。所以我知道这就是让它做到这一点的原因。但是,我通过我的代码使用该行。例如,对我的游戏流程(你必须在卖出之前买东西)执行完全相同的行在buy_is_valid函数中执行三次没有问题。我也给了一个数字,它给了我一个有效数字。它也在第66行正确使用。

有关如何跟踪此问题的任何想法?

修改

p @cities
p @current_location

返回

{:new_york=>[2, 25, 12], :chicago=>[18, 12, 2], :dallas=>[16, 12, 4], :omaha=>[16, 5, 5], :seattle=>[2, 29, 16]}
"new_york"

3 个答案:

答案 0 :(得分:2)

@citiesnil,或@cities[@current_location]nil

找出它是哪一个,然后找到一种方法来确保它已填充。 : - )

答案 1 :(得分:2)

错误消息是,您在[]上呼叫nil。由于在表达式@cities[@current_location][num]中,您首先在[]上调用@cities,然后在@cities[@current_location]的结果调用,这意味着@cities或{{ 1}}是@cities[@current_location]

要找出是哪种情况,您应尝试使用nil打印@cities@current_location。如果p @cities, @current_location@cities,那就是错误的原因。如果不是,现在至少应该明白为什么nil不是它的有效密钥。

答案 2 :(得分:0)

如果你使用的是hash.fetch()而不是hash[],那么当密钥不存在时,你会得到一个例外,而不是nil。

要进一步调试,我会做

hash.fetch(key) {raise "couldn't find #{key.inspect} amongst the keys #{hash.keys.inspect}"}