【问题标题】:Dart extends Map to facilitate lazy loadingDart 扩展 Map 以方便延迟加载
【发布时间】:2014-01-31 14:29:39
【问题描述】:

我正在尝试将数据从服务器延迟加载到地图中。
出于这个原因,我想向 Map 添加功能,以便当键不存在时,调用以获取值

我尝试的是这样的:

class LazyMap extends Map {
  // use .length for now. When this works, go use xhr
  operator [](key) => LazyMap.putIfAbsent(key, () => key.length);
}

LazyMap test = new LazyMap();

main() {
  print(test.containsKey('hallo')); // false

  // I prefer to use this terse syntax and not have to use putIfAbsent
  // every time I need something from my map
  print(test['hello']); // 5

  print(test.containsKey('hallo')); // true
}

这会引发一个错误,说明“无法解析构造函数映射以进行隐式超级调用”,这对我来说很神秘。

这是我第一次尝试扩展任何东西,所以我可能会做一些愚蠢的事情。 任何关于做得更好的建议,或者可能告诉我我正在使用一种不好的做法,我们将不胜感激。

我已经研究过这个答案:How do I extend a List in Dart,但这是关于扩展列表,而不是地图。我一直在寻找 MapBase,但找不到。
我研究了这个答案:I want to add my own methods to a few Dart Classes,但这似乎是一个非常古老的答案,没有真正的解决方案。

亲切的问候, 亨德里克·扬

【问题讨论】:

    标签: class map dart extends


    【解决方案1】:

    看看这个post,你不能扩展 Map 及其子类。我认为获得你想要的最好的方法是实现它。

    class LazyMap implements Map {
      Map _inner = {};
    
      operator [](key) => _inner.putIfAbsent(key, () => key.length);
    
      // forward all method to _inner
    }
    

    【讨论】:

    • 嗨,法里斯。您发布的链接无效。它指向您自己的 gmail 收件箱,这当然对我不起作用。你能编辑链接吗?除此之外,这是一个非常有用的答案。我本来希望听到其他的,但我似乎不得不与实施它抗衡。
    • 有没有把所有方法都转发给_inner的例子?我不确定它们每个的正确语法。
    【解决方案2】:

    你应该看过the other answer of How do I extend a List in Dart?;)在这个答案中,我指向DelegatingList。旁边是DelegatingMap

    您可以使用 DelegatingMap 作为超类或 mixin 来做您想做的事:

    import 'package:quiver/collection.dart';
    
    class LazyMap extends DelegatingMap {
      final delegate = {};
    
      operator [](key) => putIfAbsent(key, () => key.length);
    }
    

    请注意,您将无法将其与 xhr 一起使用,因为 xhr 是异步的。

    【讨论】:

    • 嗨,亚历山大。我确实看到了你的答案,它看起来很有用。在我对使用 Dart 有更多经验之前,我更喜欢使用“stock” dart 而不是使用外部库。对于图书馆,我不确定几年后相同的图书馆是否仍然存在。我可能会研究 quiver 看看它是如何写的。
    • pub.dartlang.org 永远不会删除现有的包。所以你可以毫无顾忌地使用
    • 很高兴知道这一点。在 Javascript 中有很多没有被维护或质量低的库。 Dart pub 包的维护和质量有什么保证吗?还是由用户决定他/她是否认为质量足够高? (或者这应该是一个新的 SO 问题?)
    • 我认为这可能是一个很好的 SO 问题!
    【解决方案3】:

    我的解决方案:

    import 'package:quiver/collection.dart';
    
    class MapDefault<K, T> extends DelegatingMap<K, T> {
      final delegate = {};
      final T defValue;
    
      MapDefault(this.defValue);
    
      @override
      T operator [](Object? key) => delegate[key] ?? defValue;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多