18

有没有办法将符号转换为字符串?

例如,VariableMirror 返回符号而不是字符串。有没有办法将符号转换为字符串,所以我可以打印一个类的所有变量名?

4

4 回答 4

23

使用MirrorSystem.getName()

import 'dart:mirrors';

void main() {
  var sym = new Symbol('test');
  print(MirrorSystem.getName(sym));
}

这输出:

测试
于 2013-04-17T18:05:04.610 回答
2

我对这个问题也很感兴趣。
我不能在我的包中使用 'dart:mirrors',所以使用以下内容:

String s = new Symbol('hi').toString();
s = s.substring(8,pn.length-2);

看起来很糟糕,但它可以完成工作。也许有一个性能问题。

编辑:

`机会是伟大的事情在缩小的 JS 中打破。非常气馁!` by Günter Zöchbauer

没想到这个,谢谢。
即使它现在有效,将来也有可能损坏,所以我想最好避免使用'toString()'。

确认的:

Warning: 'hi=' is used reflectively but not in MirrorsUsed. This will break minified code.index.bootstrap.initialize.dart.js:7612 
Warning: 'hi' is used reflectively but not in MirrorsUsed. This will break minified code`
于 2016-02-18T18:11:11.663 回答
1

事实证明有一个简单的解决方案

print(MirrorSystem.getName(symbol));

印刷

某人的名字

另见:https ://code.google.com/p/dart/issues/detail?id=17471

编辑

@lrn 对上面链接的问题的有趣评论

它是故意“难以使用”的。符号可以通过 dart2js 缩小,查找它们的原始名称只能通过镜像系统完成。这允许 dart2js 知道该功能是否被使用,如果不需要,则不包含转换表。一般来说,如果可能的话,我建议以一种不需要将符号转换为字符串的方式进行编码。将它们视为不透明的标记,并且仅将它们与其他标记进行比较。

Smoke 包为此提供了一项服务,该服务由其转换器以一种也适用于缩小 JavaScript 的方式转换为代码。symbolToName()nameToSymbol()

于 2014-03-15T08:59:49.850 回答
0

一些示例代码:

// Listen for App changes so we can do some things.
app.changes.listen((List<ChangeRecord> records) {
  PropertyChangeRecord record = records[0] as PropertyChangeRecord;
  String changedValue = MirrorSystem.getName(record.name);

  if (changedValue == "pageTitle") {
    print("$changedValue changed!");
  }
}
于 2014-08-29T19:01:39.057 回答