Dart三元运算符结合级联操作异常:为何两次输出结果一致?
问题分析:三元运算符与if-else的行为差异
先看你给出的两段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"]
核心原因:运算符优先级问题
Dart中级联运算符..的优先级高于三元条件运算符?:,这就导致不管三元判断的条件是true还是false,list..removeWhere(...)这部分代码都会优先执行,直接修改了原列表对象。
对于第一段代码:
true ? list1 : list1..removeWhere(...)
实际执行顺序是先运行list1..removeWhere(...),把原列表里的"a"删掉,之后三元判断取true分支,返回的是已经被修改过的list1,所以输出["b", "c"]。对于第二段代码:
false ? list2 : list2..removeWhere(...)
同样先执行list2..removeWhere(...)修改原列表,然后三元判断取false分支,返回修改后的list2,结果自然也是["b", "c"]。
为什么if-else没有这个问题?
if-else是流程控制语句,只有满足对应分支的条件时,才会执行分支里的代码。比如:
final list1 = ["a", "b", "c"]; final result1; if (true) { result1 = list1; } else { list1..removeWhere((e) => e == "a"); result1 = list1; } print(result1); // 输出 ["a", "b", "c"]
这里true分支直接返回原列表,removeWhere根本不会执行,所以结果符合预期。
如何修复三元运算符的问题?
如果想让三元运算符的行为和if-else一致,需要用括号把分支代码包裹起来,改变执行顺序:
final list1 = [ "a", "b", "c" ]; final result1 = true ? list1 : (list1..removeWhere((e) => e == "a")); print(result1); // 输出 ["a", "b", "c"] final list2 = [ "a", "b", "c" ]; final result2 = false ? list2 : (list2..removeWhere((e) => e == "a")); print(result2); // 输出 ["b", "c"]
加括号后,只有当三元判断走到对应分支时,才会执行括号里的removeWhere操作。
内容的提问来源于stack exchange,提问作者Shreyash.K
相关产品推荐
相关产品推荐

