将符号转换为字符串

时间:2013-04-17 11:12:44

标签: dart

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

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

4 个答案:

答案 0 :(得分:21)

使用MirrorSystem.getName()

import 'dart:mirrors';

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

输出:

test

答案 1 :(得分:2)

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

print(MirrorSystem.getName(symbol));

打印

  

somename

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

编辑

上述@lrn

链接问题的有趣评论
  

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

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

答案 2 :(得分:2)

我也在这个问题上堆叠 我不能在我的包中使用'dart:mirrors',所以使用下面的内容:

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

看起来很糟糕,但它完成了工作。也许存在性能问题。

编辑:

`机会是在缩小的JS中突破的好事。非常沮丧!“由GünterZö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`

答案 3 :(得分: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!");
  }
}