麻烦的字典数组,红宝石

时间:2010-03-22 22:36:43

标签: ruby

我收到以下错误。

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是一个从文件中读取的一系列图块。每个图块都是字典。

感谢您的帮助,我无法弄明白

4 个答案:

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

然后,我不知道你的申请,也许这是完全合适的^ _ ^