带级联飞镖的三元运算符的奇怪行为

Shr*_*h.K 5 conditional-operator dart

为什么两个结果打印出来是一样的?

final list1 = [ "a", "b", "c" ];
final result1 = true ? list1 : list1..removeWhere((e) => e == "a");
print(result1); // prints ["b", "c"]

final list2 = [ "a", "b", "c" ];
final result2 = false ? list2 : list2..removeWhere((e) => e == "a");
print(result2); // prints ["b", "c"]
Run Code Online (Sandbox Code Playgroud)

这种情况仅发生在三元条件下。当在正常的 if-else 中时,这工作得很好。

Dha*_*han 9

三元运算符在级联运算符之前计算,因此基本上代码相当于

final result1 = (true ? list1 : list1)..removeWhere((e) => e == "a");
Run Code Online (Sandbox Code Playgroud)

而不是你所期望的

final result1 = true ? list1 : (list1..removeWhere((e) => e == "a"));
Run Code Online (Sandbox Code Playgroud)

请参阅:运算符优先级

  • 直觉上,级联运算符感觉更接近成员访问(点),所以我盲目地认为它的优先级高于三元(类似于点)并停止使用我的大脑。感谢你的回答。 (2认同)