Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 带映射的空感知运算符_Dart - Fatal编程技术网

Dart 带映射的空感知运算符

Dart 带映射的空感知运算符,dart,Dart,我有过,现在是了 我想做什么 以下语法不是Dart,因为它不编译: 如果我的地图不是地图,而是列表,它看起来会像: 我在寻找什么 我知道map?[key]不是有效的语法,因此我正在搜索类似的东西,它适用于列表和映射 map?.valueFor(key) ?? otherValue 价值 这显然还不存在。该问题有解决方案和解决方案。这可以: (map ?? const {})[key] ?? otherValue; 因为键将回退到访问空的映射,该映射将始终返回null或 map != null

我有过,现在是了

我想做什么 以下语法不是Dart,因为它不编译:

如果我的
地图
不是
地图
,而是
列表
,它看起来会像:

我在寻找什么 我知道
map?[key]
不是有效的语法,因此我正在搜索类似的东西,它适用于列表和映射

map?.valueFor(key) ?? otherValue
价值 这显然还不存在。该问题有解决方案和解决方案。

这可以:

(map ?? const {})[key] ?? otherValue;
因为
将回退到访问空的
映射
,该映射将始终返回
null

map != null ? map[key]: otherValue;

在尝试访问变量之前检查映射是否为null,这与Günter的答案相同,但首先检查。

我使用此函数进行空安全嵌套映射访问:

// Returns value of map[p1][p2]...[pn]
// where path = [p1, p2, ..., pn]
//
// example: mapGet(map, ["foo", 9, 'c'])
dynamic mapGet(Map map, List path) {
  assert(path.length > 0);
  var m = map ?? const {};
  for (int i = 0; i < path.length - 1; i++) {
      m = m[path[i]] ?? const {};
  }

  return m[path.last];
}
//返回map[p1][p2]…[pn]的值
//其中路径=[p1,p2,…,pn]
//
//示例:mapGet(map,[“foo”,9,'c'])
动态映射获取(映射、列表路径){
断言(path.length>0);
var m=映射??常数{};
for(int i=0;i
类似的功能可以用作扩展功能:

extension MapExtensions<T, K> on Map<T, K> {
  K getOrNull(T key) {
     if (this == null || !this.containsKey(key)) {
       return null;
     } else {
       return this[key];
     }
  }

  K getOrElse(T key, K fallback) {
    return this.getOrNull(key) ?? fallback;
  }
}
扩展地图地图地图上的扩展{
K getOrNull(T键){
if(this==null | |!this.containsKey(key)){
返回null;
}否则{
返回此[键];
}
}
K getOrElse(T键,K回退){
返回此.getOrNull(键)??回退;
}
}

注意:我还没有测试过这个,但应该可以使用。

我使用过几次的另一种语法:

map?.containsKey(key) ?? false ? map[key] : otherValue
尽管在功能上与@Günter Zöchbauer提出的方案相当,但它有点麻烦。

无论如何,由于它在某些情况下看起来更清晰,因此值得一提。

我根据上述答案编写了自己的版本。它主要用于JSON对象处理

DynamicMaporListGet(动态地图,列表路径){
断言(path.length>0);
断言(map是List | | map是map);
var m=映射??常数{};
var firstEl=path.removeAt(0);
变量结果=(m是列表)
?(第一个元素

这就是它的工作原理。

这确实有效,而且看起来很漂亮。我想知道我怎么没有想到这一点,我是否应该为此创建一个问题。你是说
map?[key]
的问题。我认为这不太可能被添加<代码>?
仅受
支持。请求为
list?[index]
提供支持,但据我记忆所及,拒绝了。对于
map.valueOf(key)
之类的内容,我明白了。可以尝试使用.<代码> const {}{代码>,以避免每次创建新的映射,至少在类型允许的情况下。您应该使用<代码> T MMAGET(MAP,列表路径){而不仅仅是
dynamic
。当然,您可以使用不同程度的丑陋代码,但满意的答案必须等待Dart的未来版本:
extension MapExtensions<T, K> on Map<T, K> {
  K getOrNull(T key) {
     if (this == null || !this.containsKey(key)) {
       return null;
     } else {
       return this[key];
     }
  }

  K getOrElse(T key, K fallback) {
    return this.getOrNull(key) ?? fallback;
  }
}
map?.containsKey(key) ?? false ? map[key] : otherValue