对象引用中断迭代循环
Object referencing breaking iteration loops
所以我有一个应用程序,我制作了一个 stackblitz for。它基本上是 Pacman,为 'maze'.
生成一个随机迷宫
迷宫算法设计用于两种设置之一
- 作为发生的一代,只是returns一个迷宫对象
或者
- 作为迭代生成,在每次迭代后通过 Subject 更新主线程。
这意味着您可以快速生成它,或者随着时间的推移生成它并观察迷宫的发展。即时解决方案工作正常,'over time' 解决方案也可以,但在一种情况下除外。
我在 maze-algorithms.model.ts
文件中添加了三个函数:
mirrorMazeYDirection
- 在y方向制作迷宫的镜像
mirrorMazeXDirection
- 在 x 方向制作迷宫的镜像
makeWallsThick
- 使迷宫 1 的墙壁变厚,这意味着没有急转弯或任何东西
如果我这样称呼它们,一切正常:
let newMaze: Maze2D = { ...iterationUpdate.maze };
newMaze = mazeObject.makeWallsThick({ ...newMaze });
newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);
不过,如果我先镜像,然后将墙壁加厚,它不会...
newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);
newMaze = mazeObject.makeWallsThick({ ...newMaze });
您可以在 app.component.ts
中的 generateMaze()
函数中的 stackblitz 中进行测试。
在这种情况下,迷宫的大小每次都会加倍 - 主体在获取新数据时似乎正在处理来自 mirrorx 和 y 函数的处理数据,不是 新数据。该阵列很快就会失控。它似乎也没有正确镜像,所以感觉 mirrorX 和 Y 函数以某种方式反馈到生成算法中。
我对为什么会这样感到困惑,尝试过复制对象并非常小心,我没有将任何东西反馈到迭代路由中,但它似乎一直无法工作,除非我先加厚墙壁。
编辑:重申一下,这只是一个问题,如果程序随着时间的推移迭代,如果它只是制造迷宫,returns 通过主题,然后我镜像并加厚,这一切工作正常。只有当我随着时间的推移迭代,如果我在加厚墙壁之前进行镜像。
问题是,当您使用 { ...newMaze }
调用您的函数时,您只是传递了一个浅表副本。对象的属性仍然共享相同的引用(它们指向相同的事物)。查看您的代码,我看到 makeWallsThick
创建了一个新的迷宫对象,但是 mirror..
函数对输入进行了另一个浅拷贝,然后更新了浅拷贝中的图块 - 这也更新了输入。
所以我有一个应用程序,我制作了一个 stackblitz for。它基本上是 Pacman,为 'maze'.
生成一个随机迷宫迷宫算法设计用于两种设置之一
- 作为发生的一代,只是returns一个迷宫对象 或者
- 作为迭代生成,在每次迭代后通过 Subject 更新主线程。
这意味着您可以快速生成它,或者随着时间的推移生成它并观察迷宫的发展。即时解决方案工作正常,'over time' 解决方案也可以,但在一种情况下除外。
我在 maze-algorithms.model.ts
文件中添加了三个函数:
mirrorMazeYDirection
- 在y方向制作迷宫的镜像mirrorMazeXDirection
- 在 x 方向制作迷宫的镜像makeWallsThick
- 使迷宫 1 的墙壁变厚,这意味着没有急转弯或任何东西
如果我这样称呼它们,一切正常:
let newMaze: Maze2D = { ...iterationUpdate.maze };
newMaze = mazeObject.makeWallsThick({ ...newMaze });
newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);
不过,如果我先镜像,然后将墙壁加厚,它不会...
newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);
newMaze = mazeObject.makeWallsThick({ ...newMaze });
您可以在 app.component.ts
中的 generateMaze()
函数中的 stackblitz 中进行测试。
在这种情况下,迷宫的大小每次都会加倍 - 主体在获取新数据时似乎正在处理来自 mirrorx 和 y 函数的处理数据,不是 新数据。该阵列很快就会失控。它似乎也没有正确镜像,所以感觉 mirrorX 和 Y 函数以某种方式反馈到生成算法中。
我对为什么会这样感到困惑,尝试过复制对象并非常小心,我没有将任何东西反馈到迭代路由中,但它似乎一直无法工作,除非我先加厚墙壁。
编辑:重申一下,这只是一个问题,如果程序随着时间的推移迭代,如果它只是制造迷宫,returns 通过主题,然后我镜像并加厚,这一切工作正常。只有当我随着时间的推移迭代,如果我在加厚墙壁之前进行镜像。
问题是,当您使用 { ...newMaze }
调用您的函数时,您只是传递了一个浅表副本。对象的属性仍然共享相同的引用(它们指向相同的事物)。查看您的代码,我看到 makeWallsThick
创建了一个新的迷宫对象,但是 mirror..
函数对输入进行了另一个浅拷贝,然后更新了浅拷贝中的图块 - 这也更新了输入。