【问题标题】:How to change object value in a loop in Dart如何在 Dart 的循环中更改对象值
【发布时间】:2020-07-24 08:19:56
【问题描述】:

我是 Dart 的新手,尝试在循环中更改 Object 的成员值时遇到了很多问题。

我的对象是这样定义的:

class Cell {
  int magicnum, x, y;

  Cell(this.magicnum);

  toString() {
    return ("$magicnum - [$x][$y]");
  }
}

我创建了一个单元列表列表(二维数组),然后我需要根据数组中每个对象的位置填充 x 和 y 值。

for (int x = 0; x < DIM; x++) {
    for (int y = 0; y < DIM; y++) {      
      grids[x][y].x = x;
      grids[x][y].y = y;      
    }
  }

这显然行不通,因为在 Dart 中,所有内容(也是整数)都是一个对象,因此,我数组中的所有 Cell 对象都具有相同的 x 和 y 值(它们都得到了对同一对象的引用)。 我该怎么办?

谢谢

@julemand101 数组是这样制作的:

List<Cell> cells = List<Cell>.generate(DIM, (i) => Cell(i + 1));
  List<List<Cell>> grids = List<List<Cell>>();

  for (int i = 0; i < DIM; i++) {
    grids.add(shuffleCell(cells));
  }

【问题讨论】:

  • 你试过了吗? int 不是一个可变对象,所以当你说x++ 时,你实际上是在创建一个新实例(在 OOP 意义上)并且不会修改现有实例(理论上......实际上 int 被表示为幕后的普通 int )。
  • 因此,如果您确实尝试过并且仍然看到网格中的所有对象共享相同的变量,可能是因为您在创建二维数组时忘记创建一个新的 Cell 对象每个坐标?
  • 您能否提供一个完整的运行示例(可以粘贴到例如dartpad.dev)来显示问题?我很难猜测你们每个组件是如何绑定在一起的。
  • 是的。 link
  • 另外,您似乎只创建了一次单元格,但在grids 中为每个网格共享它们?

标签: dart reference variable-assignment


【解决方案1】:

您的问题是当您执行以下操作时,您实际上并没有克隆每个 Cell 对象(取自 cmets 的代码示例):

List<Cell> newlist = List<Cell>.from(items);

相反,您正在创建一个新的List,其中包含对Cell 对象的引用,与之前的项目列表相同。

要创建Cell 对象的副本,您需要实现如下克隆方法:

class Cell {
  int magicnum, x, y;

  Cell(this.magicnum);

  Cell.from(Cell cell)
      : magicnum = cell.magicnum,
        x = cell.x,
        y = cell.y;
}

并执行以下操作来迭代旧列表的每个元素,为每个元素创建一个新的Cell 对象并将结果转换为新的列表:

List<Cell> newlist = items.map((item) => Cell.from(item)).toList();

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 2021-07-30
    • 2020-06-07
    • 2017-07-24
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多