tictactoedef.rb:221:在`block in comp_block':undefined method` []' for nil:NilClass(NoMethodError)

时间:2013-11-12 22:42:31

标签: ruby

任何人都可以帮助一个相对较新的红宝石人,看看为什么我得到这个没有方法错误?非常感谢!

def comp_block
only_user_valued = @winning_propositions.map { |each_hash| each_hash.select { |key, value| value == @user_sign } }
count_of_each = only_user_valued.map { |count_the_items_in_hash| count_the_items_in_hash.count }
index_array = count_of_each.each_with_index.select { |num, index| num == 2 }.map { |index_spot| index_spot[1] }
  if index_array.empty? == true
    random_move
  else
    @nil_valued_values_array = []
    @nil_valued_array_true_false = []
    index_array.each do |element|
      @nil_valued_values_array += [@winning_propositions[element].select { |key, value| value == nil }]
      @nil_valued_array_true_false += [@nil_valued_values_array.empty?]
    end

nil_value = @nil_valued_values_array.delete({})
move = nil_value[0].keys[0]

    if @nil_valued_array_true_false == [false] || @nil_valued_array_true_false == [true, false] || @nil_valued_array_true_false == [false, true]
      @possible_places[move] = @comp_sign
        #changes the winning prop values in parallel
          list_of_matching_arrays=@winning_propositions.select { |key, value| key.to_s.match(move.to_s) }
            list_of_matching_arrays.each do |change_hash_value|
              change_hash_value[move] = @comp_sign
            end
      puts @comp_name + " made the move: #{move}"
      display_game_board
      puts "Here I am defending/BLOCKED!!!!!!"
    else @nil_valued_array_true_false == [true] || @nil_valued_array_true_false == [true, true]
     random_move
    end
  end
end

2 个答案:

答案 0 :(得分:0)

嗯,这不是一个修复(因为你有很多代码,不确定外部发生了什么),但是你应该添加一些调试语句。

看这里:

move = nil_value[0].keys[0]

如果nil_valuekeysnil,您将明显收到该错误。我建议你打印它们的值,看看哪一个是空的:

puts "<<<<< NIL_VALUE: #{nil_value}"
puts "<<<<< NIL_VALUE[0]: #{nil_value[0]}"
puts "<<<<< NIL_VALUE[0].KEYS: #{nil_value[0].keys}"

等等。

答案 1 :(得分:0)

嗯,显然nil_valuenil_value[0].keys都是nil。看两行代码:

nil_value = @nil_valued_values_array.delete({})
move = nil_value[0].keys[0]

最明显的原因是@nil_valued_values_array.delete({})找不到要删除的空哈希,thus returns nil,或者如果确实找到一个,则返回空哈希。