[英]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.