2012-11-05 4 views
0

루비에서 반복에 대해 혼란스러워했습니다. 다음 코드에서 필자는 두 경로가 동일해야한다고 예상했습니다. 그러나 실제로 그들은 그렇지 않습니다. 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 

답변

0

그 문제는이 라인

new_path = path 

당신은 new_pathpath 다른 객체 생각할 수에 있지만 그렇지 않은 날 것으로 보인다. 나는 예제를 설명합니다 :

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

ab가 하나의 객체를 가리키는 참조입니다. 당신을 위해 simpliest 솔루션은 dup 또는 clone

new_path = path.clone 

하지만, 실제로 코드가 좋은 청소를 필요로 사용하는 것입니다.