Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 将映射值自动初始化为0的习惯用法_Dart - Fatal编程技术网

Dart 将映射值自动初始化为0的习惯用法

Dart 将映射值自动初始化为0的习惯用法,dart,Dart,是否有比下面更好的习惯用法将映射值自动初始化为0?在下面的代码中,向List类型的目标添加值的方法与int之间存在不对称性 main(){ 地址列表(地图m,v)=> m、 .putIfAbsent('foo',()=>[])。添加(v); /////////////////////////////////////////////////////////// //不允许(表达式不可赋值) //addToScalar(地图m,v)=> //m..putIfAbsent('foo',()=>0)+=

是否有比下面更好的习惯用法将映射值自动初始化为0?在下面的代码中,向List类型的目标添加值的方法与int之间存在不对称性

main(){
地址列表(地图m,v)=>
m、 .putIfAbsent('foo',()=>[])。添加(v);
///////////////////////////////////////////////////////////
//不允许(表达式不可赋值)
//addToScalar(地图m,v)=>
//m..putIfAbsent('foo',()=>0)+=3;
addToScalar1(地图m、v){
m、 putIfAbsent('foo',()=>0);
m['foo']+=v;
返回m;
}
addToScalar2(地图m、v){
if(m.containsKey('foo')){
m['foo']+=v;
}否则{
m['foo']=v;
}
返回m;
}
打印(addToList({},3));
打印(addToScalar1({},3));
打印(addToScalar2({},3));
}
从概念上讲,addToList和addToScalar做相似的事情。但作为值类型存储的int的模拟值可能是:

m.putIfAbsent('foo', () => 0) += someValue

这将不起作用,因为从putIfAbsent返回的内容是不可分配的。因此,对于标量情况中使用的两种工作方法,在映射中对键“foo”的查找将进行两次。使用Map API可以避免这种情况吗?

否,您当前无法避免两次查找以修改Map值

我们已经考虑过,但从未决定实现这一目标的方法(例如,“更新”方法)

解决您的问题的两个最短/最有效的解决方案是:

int _returnZero() => 0; // Toplevel or static function.

...  
  map[key] = map.putIfAbsent(key, _returnZero) + v;
...
以及:


当然,您可以创建一个Map类的子类来覆盖add()…是的,但是我看到的版本仍然只是包装一个内部Map以进行委派,问题仍然存在。如果addToScalar1是这样做的话——我同意。但我只是想知道这是一个好习惯用法还是api中有更好的东西。还希望深入了解列表和int示例之间的根本区别。我想,如果int有一个名为plusEquals的方法,就不会有问题了。这个特性有一个dartbug文件吗?
int value = map[key];
map[key] = (value == null) ? v : value + v;