带私有标识符参数的符号

时间:2015-03-18 03:03:14

标签: dart symbols dart-editor dart-analyzer

我想创建一个等于私有MethodMirror的简单名称的符号。但是,Symbol的文档声明新Symbol的参数必须是有效的公共标识符。如果我尝试创建一个const Symbol('_privateIdentifier') dart编辑器通知我对此常量表达式的评估将引发异常 - 虽然程序运行正常,但我能够毫无问题地使用它。

void main(){
  //error flagged in dart editor, though runs fine.
  const s = const Symbol('_s');
  print(s); //Symbol("_s");
}

镜像系统似乎使用了符号。

import 'dart:mirrors';
class ClassA{
  _privateMethod(){}
}

void main(){
  var classMirror = reflect(new ClassA()).type;
  classMirror.declarations.keys.forEach(print);
  //Symbol("_privateMethod"), Symbol("ClassA")
}

飞镖编辑器中的文档/错误标记是否是由于过时的飞镖分析器导致的遗留错误?或者是否有计划在未来执行这项公共要求?是否有另一种方法可以创建一个唯一的识别符号,该符号将缩小为与声明的简单名称相同的符号

2 个答案:

答案 0 :(得分:3)

如果它没有抛出,那么VM在const符号构造函数中有一个错误。

问题在于" _s"如果没有说出它属于哪个库,则不会识别私有变量。由于这个原因,符号构造函数有一个第二个参数采用LibraryMirror,并且传入一个私有名称而不传入镜像应抛出。 在const构造函数中很难做到这一点而没有侧面执行const构造函数的要求(没有执行代码!),这可能是VM无法处理它的原因。它需要在编译器级别进行特殊处理。

您还会发现const Symbol('_s')#_s不同。后者为当前库创建一个私有符号,前者(如果它运行)创建一个名为' _s'的非私有符号,这不是真正有用的。例如,print(identical(#_s, const Symbol('_s')));打印为false。

答案 1 :(得分:1)

要抓住符号,我认为你需要从对象中获取它。 e.g。

  reflect(thing).type.declarations.keys.firstWhere(
    (x) => MirrorSystem.getName(x) == "_privateThingIWant");