在Dart中,是否可以有闭包的const映射?

Arg*_*tus 6 dart

我创建了一个闭包的文字地图,例如:

Map<String, Function> mapOfFuncs = {
  'foo': (a, b, c) => ... ,
  'bar': (a, b, c) => ... ,
   ...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止都很好.然后我想制作这张地图const,因为它在我的程序中是全局的,不应该被修改.

const Map<String, Function> MAP_OF_FUNCS = const {
  'foo': (a, b, c) => ... ,
  'bar': (a, b, c) => ... ,
   ...
}
Run Code Online (Sandbox Code Playgroud)

由于地图中的字面闭包不是,所以Dart扼杀了这一点const.

在Dartpad:https://dartpad.dartlang.org/817d2cfd141b0a56fc7d

我原本认为文字封闭是const.有没有办法让它们如此?

isa*_*s-b 7

我怀疑这可能不可能,看看这段代码:

int test1(int a, int b, int c) {
  return a;
}
int test2(final int a, final int b, final int c) {
  return a;
}

const Function f1 = test1;
const Function f2 = (final a,b,c) => a;

const Map<String, Function> MAP_OF_FUNCS = const {
  'foo': test1,
  'fam': test2,
  'bam': f1,
  'bar': f2
};
Run Code Online (Sandbox Code Playgroud)

只有引用静态方法的前两个版本引用test1test2在此星座中工作.甚至f1产生编译错误,UPDATE但是使用dartJS编译为@irn来自指出的注释.然后不清楚为什么版本f2不起作用.

因此,可能是赋值运算符无法为给定的常量lambda表达式生成静态编译的引用,或者为其RHS(右侧)参数生成静态方法引用.

文档指出我测试static const组合,但这通常只适用于非顶级元素,如类成员.因此,添加一个新类可以测试它.

class A {
  static const Function a1 = test1;
  static const Function a2 = (final a, final b, final c) => a;
}
const Map<String, Function> MAP_OF_FUNCS = const {
  'foo': A.a1,
  'bar': A.a2
};
Run Code Online (Sandbox Code Playgroud)

但是,这些函数定义有效,但将其分配给映射会失败.有关内置类型部分下的地图的文档显示了如何使用final关键字创建编译时常量映射.

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法具有相同的缺点.它可能与符号的缩小限制有关:

Symbol对象表示Dart程序中声明的运算符或标识符.您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号....符号文字是编译时常量.

有关符号的更多信息,请参阅dart:mirrors - reflection.

也许别人有更好的主意,但对我而言,目前这似乎是不可能的.


Gün*_*uer 7

const表达式不支持闭包。有一个公开的问题https://github.com/dart-lang/sdk/issues/4596https://github.com/Pajn/dep-const-function-literals/issues/1

如果改为创建静态函数,则可以在const映射文字中引用它们,但当前无法内联定义它们。