什么是Dart"Expando"功能,它有什么作用?

geo*_*ler 18 expando nosuchmethod dart

最近在Dart上看到过"Expando"一词.听起来不错.API没有为我提供太多线索.

一两个例子可能是最有帮助的!

(不确定这是否相关,但我最担心的是将方法(getter)和/或变量添加到类中.希望这可能是解决这个问题的关键.(提示:我正在使用Nosuchmethod方法现在,希望能够返回未完成方法的值.))

提前致谢,

_swarmii

Joh*_*ans 14

Expandos允许您将对象关联到其他对象.一个非常有用的例子是HTML DOM元素,它本身不能被分类.让我们创建一个顶级expando来为元素添加一些功能 - 在这种情况下是typedef语句中给出的Function签名:

typedef CustomFunction(int foo, String bar);

Expando<CustomFunction> domFunctionExpando = new Expando<CustomFunction>();
Run Code Online (Sandbox Code Playgroud)

现在使用它:

main(){
   // Assumes dart:html is imported
   final myElement = new DivElement();

   // Use the expando on our DOM element.
   domFunctionExpando[myElement] = someFunc;

   // Now that we've "attached" the function to our object,
   // we can call it like so:
   domFunctionExpando[myElement](42, 'expandos are cool');
}

void someFunc(int foo, String bar){
  print('Hello. $foo $bar');
}
Run Code Online (Sandbox Code Playgroud)

  • 这和Map <Element,CustomFunction>有什么不同? (10认同)
  • @ZdeněkMlčoch Expando 不会阻止键的垃圾收集!在这方面,它可以与 JavaScript 的 WeakMap 进行比较。 (2认同)

Car*_*ght 10

只是为了澄清expando和maps之间的区别:如组中所报告的,expando具有弱引用.
这意味着密钥可以被垃圾收集,即使它仍然存在于expando中(只要没有其它引用).

对于所有其他意图和目的,它是一张地图.