【问题标题】:How to return from a forEach loop in Dart?如何从 Dart 中的 forEach 循环返回?
【发布时间】:2018-05-14 17:40:09
【问题描述】:

我有这个功能

  bool nameExists(players, player) {
    players.forEach((f) {
      if (f.data['name'].toLowerCase() == player.toLowerCase()) {
        return true;
      }
    });

    return false;
  }

即使满足条件,它也总是返回 false。

有什么想法吗?

【问题讨论】:

  • 使用map 而不是foreach

标签: for-loop dart


【解决方案1】:

无法从forEach 返回值。 只需使用 for 循环即可。

  bool nameExists(players, player) {
    for(var f in players) {
      if (f.data['name'].toLowerCase() == player.toLowerCase()) {
        return true;
      }
    }

    return false;
  }

【讨论】:

  • 除此之外,Dart 风格指南特别是 recommends 使用 for 循环在 forEach 上,除非您可以重用现有函数。
  • “Dart 不支持非本地返回,所以从回调中返回不会破坏循环”这句话呢?这是旧闻,不再适用吗?还是只适用于foreach循环?
  • 当然,但打破循环并返回一个值似乎是问题中的要求。
【解决方案2】:

对于这个特定的用例,您也可以使用any() 代替forEach(),例如

bool nameExists(players, player) =>
  players.any((f) => f.data["name"].toLowerCase() == player.toLowerCase());

【讨论】:

    【解决方案3】:

    我找到了另一个 SO:

    How to stop Dart's .forEach()?

    其中一个回复是这样说的:

    Dart 不支持非本地返回,因此从回调返回不会中断循环。它在 jQuery 中工作的原因是 each() 检查回调返回的值。 Dart forEach 回调返回 void。

    我没有找到官方文档来提供链接。但根据类似的问题、他们的答案和代码的行为,它是有意义的。

    还基于该链接中的其他答案,您需要执行以下操作: 请注意,它使用“for in”循环而不是 foreach。 for in 函数作为 C# 或类似语言中的 foreach 函数。

    bool nameExists(players, player) {
      bool result = false;
      for(var f in players) {
        if (f.data['name'].toLowerCase() == player.toLowerCase()) {
          result = true;
          break;
        }
      }
    
      return result;
    }
    

    或者有其他机制的例子可以用来在链接的 SO 中实现相同的目标。

    【讨论】:

    • 您复制的示例不使用forEach。相反,他们使用forwhile 循环。此处示例代码中的break 在语法上是不允许的。
    • 啊,我明白你在说什么。他们实际上将 foreach 更改为 for 循环。有趣的是,您甚至不能对 foreach 使用 break 命令。我已经更新了答案
    【解决方案4】:

    forEach 是一个 void 方法,它不是一个返回类型的函数。所以你应该使用map 而不是forEachforEach 它只是按迭代顺序应用集合的每个元素。而是map函数在迭代后返回的对象。

    你可以这样使用它

      bool nameExists(players, player) {
        players.forEach((f) {
          if (player.name == "Tony") {
            return true;
          }
        });
    
        return false;
      }
    

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多