我创建了一个闭包的文字地图,例如:
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.有没有办法让它们如此?
我怀疑这可能不可能,看看这段代码:
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)
只有引用静态方法的前两个版本引用test1并test2在此星座中工作.甚至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.
也许别人有更好的主意,但对我而言,目前这似乎是不可能的.
const表达式不支持闭包。有一个公开的问题https://github.com/dart-lang/sdk/issues/4596和https://github.com/Pajn/dep-const-function-literals/issues/1
如果改为创建静态函数,则可以在const映射文字中引用它们,但当前无法内联定义它们。
| 归档时间: |
|
| 查看次数: |
3009 次 |
| 最近记录: |