当我运行我的代码时,我得到以下内容:
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"
答案 0 :(得分:2)
@cities
为nil
,或@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}"}