繁体   English   中英

红宝石块迭代

[英]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_pathpath是不同的对象,但事实并非如此。 我将举例说明:

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

ab是指向一个对象的引用。 最简单的解决方案是使用dupclone

new_path = path.clone

但实际上您的代码需要良好的清理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM