0

私はrubyでの反復について混乱しました。私が書いた次のコードでは、2つのパスが同じになるはずだと思っていました。しかし、実際にはそうではありません。forループでパスが変更されたようです。

私のコードに何か問題がありますか?ありがとう

def one_step_search(dest,paths)
  direction = %w(north east south west)
  new_paths = []
  paths.map do |path|

    print "original path is: "
    print_path path

    curr_room = path.last
    for i in 0..3
      new_path = path
      if !curr_room.send("exit_#{direction[i]}").nil?
        next_room_tag = curr_room.send("exit_#{direction[i]}")[0] 
        next_room = find_room_by_tag(next_room_tag)
        if !new_path.include?(next_room)  # don't go back to the room visited before
          new_path << next_room
          new_paths << new_path  
          print "new path is: "
          print_path path
          return new_paths if dest.tag == next_room_tag
        end
      end
    end
  end

  return new_paths
end
4

1 に答える 1

0

問題はこの行にあるように私には思えます

new_path = path

あなたはそれを別のオブジェクトだnew_pathと思うかもしれませんが、そうではありません。path例で説明します。

a = "foo"
b = a
puts a.sub!(/f/, '_')
puts a                   # => "_oo"
puts b                   # => "_oo"

aおよびbは、1つのオブジェクトを指す参照です。dupあなたのための最も簡単な解決策は、またはを使用することですclone

new_path = path.clone

しかし実際には、コードを適切にクリーニングする必要があります。

于 2012-11-05T04:05:40.493 に答える