繁体   English   中英

Dart 有逗号运算符吗?

[英]Does Dart have a comma operator?

考虑以下在 Dart 中无法编译的代码行——缺少逗号运算符,但在 JavaScript 或 C++ 中类似的东西完全没问题:

final foo = (ArgumentError.checkNotNull(value), value) * 2;

我能用丑陋的解决方法得到的最接近的是

final foo = last(ArgumentError.checkNotNull(value), value) * 2;

有功能

T last<T>(void op, T ret) => ret;

有更好的解决方案吗?

Dart 没有类似于 JavaScript 中的逗号运算符。

没有明显比您已有的解决方案更好的解决方案。

您介绍的变通操作是我将如何解决它。 我通常把它叫做seq为“序列”如果我写它。

遗憾的是没有使用扩展运算符的好方法,因为您需要在第二个操作数上是通​​用的,而运算符不能是通用的。 您可以使用扩展方法,如:

extension Seq on void {
  T seq<T>(T next) => next;
}

然后你可以写ArgumentError.checkNotNull(value).seq(value)

(就其价值而言, ArgumentError.checkNotNull函数已更改为返回其值,但该更改是在 Dart 2.7 发布后进行的,因此它只会在此后的下一个版本中可用)。

如果开销无关紧要,您可以使用不带参数的闭包来实现类似的效果(以及比仅表达式序列更复杂的操作)。

final foo = () {
  ArgumentError.checkNotNull(value);
  return value;
} ();

由于创建和调用闭包所产生的开销,这对于热路径不是很好,但在这些路径之外可以很好地工作。

如果您不止一次需要这种测试加初始化模式,最简洁的方法可以说是将它放在自己的函数中,无论如何。

T ensureNotNull<T>(T value) {
  ArgumentError.checkNotNull(value);
  return value;
}

final foo = ensureNotNull(value);

暂无
暂无

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

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