Dart级联运算符操作为何修改原列表 两种排序写法差异咨询
疑问解答
1、第一种写法排序时为什么原列表也被修改了?
Dart的*级联运算符(..)*核心规则是:所有级联操作的返回值始终是最开始的调用主体,不会传递中间步骤的返回值。
你的第一种写法intList..toList()..sort()实际执行逻辑如下:
- 第一步:取初始调用主体
intList(也就是你的原列表) - 第二步:调用
intList.toList()生成原列表的拷贝,但因为是级联调用,toList()的返回值(新拷贝)会被直接丢弃,级联操作仍然返回原intList - 第三步:对级联返回的原
intList执行sort()方法,排序操作直接作用在原列表上,原列表自然会被修改。
2、第二种写法中实际被排序的是哪个列表?
第二种写法里普通链式调用的优先级高于级联运算符,所以intList..toList().sort()的实际执行逻辑如下:
- 第一步:取初始调用主体
intList - 第二步:先执行
intList.toList()生成原列表的临时拷贝,再直接对这个临时拷贝调用sort()方法,排序操作完全作用在这个没有被任何变量持有的临时拷贝上,排序完成后这个临时列表就会被回收 - 级联操作最终仍然返回原
intList,所以你拿到的sorted2还是未修改的原列表。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

