我收到以下错误。
game.rb:46:in `play': undefined method `[]' for nil:NilClass (NoMethodError) from game.rb:45:in `each' from game.rb:45:in `play' from game.rb:56
使用此代码,
def play()
currentTile = nil
@tiles.each do |tile|
if(tile['Name'] == 'Starting Square')
currentTile = tile
end
puts("#{currentTile['Desciption']}")
end
end
这是文字冒险游戏的一部分,我正在玩@tiles是一个从文件中读取的一系列图块。每个图块都是字典。
感谢您的帮助,我无法弄明白
答案 0 :(得分:1)
我看到您可能正在尝试通过打印调试是否已设置currentTile
。一切都很好,花花公子。
但请注意,在名称与Starting Square
匹配之前,currentTile
将继续为nil
,您无法访问nil
对象的属性。也许起始广场不是名单上的第一个牌?
答案 1 :(得分:1)
试试这个:
def play()
currentTile = nil
@tiles.each do |tile|
currentTile = tile if tile['Name'] == 'Starting Square'
puts("#{currentTile['Desciption']}") unless currentTile.nil?
end
end
你有一个错误,因为currentTile在第一次迭代中变成了一个tile。只有当瓷砖名称为“起始广场”时,它才会获得“描述”键
答案 2 :(得分:0)
看起来你正在尝试打印currentTile的描述,但是你已经将搜索循环放入了搜索循环中。
尝试:
def play()
currentTile = nil
@tiles.each do |tile|
if(tile['Name'] == 'Starting Square')
currentTile = tile
end
end
puts("#{currentTile['Desciption']}")
end
仍然无法保证您不会获得零参考(如果没有名称为'Starting Square'的图块,但是您获得的代码只有在@tiles中的第一个图块是一个名为'起始广场'的人
答案 3 :(得分:0)
其他答案似乎已经涵盖了(在设置为nil后将currentTile编入索引),但无论它的价值如何,您可能希望使用符号作为键和值,而不是字符串。符号查找速度更快,比较速度更快,因为它们只是命名指针,而检查字符串相等性是O(n)操作。
类似
def play()
currentTile = nil
@tiles.each do |tile|
if(tile[:name] == :startingSquare)
currentTile = tile
end
end
puts("#{currentTile['Desciption']}") unless currentTile.nil?
end
然后,我不知道你的申请,也许这是完全合适的^ _ ^