[英]ruby block iteration
我對ruby中的迭代感到困惑。在我編寫的以下代碼中,我期望打印出的兩個路徑應該相同。 但實際上不是。 似乎在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
在我看來問題出在這一行
new_path = path
您可能會認為new_path
和path
是不同的對象,但事實並非如此。 我將舉例說明:
a = "foo"
b = a
puts a.sub!(/f/, '_')
puts a # => "_oo"
puts b # => "_oo"
a
和b
是指向一個對象的引用。 最簡單的解決方案是使用dup
或clone
new_path = path.clone
但實際上您的代碼需要良好的清理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.