带有私有标识符参数的符号

Symbol with private identifier argument

我想创建一个与私有 MethodMirror 的简单名称相同的符号。但是,Symbol 的文档指出 new Symbol 的参数必须是有效的 public 标识符。如果我尝试创建一个 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")
}

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

如果它没有抛出,则 VM 在 const Symbol 构造函数中存在错误。

问题是“_s”在没有说明它属于哪个库的情况下不识别私有变量。出于这个原因,符号构造函数有第二个参数采用 LibraryMirror ,并且在不传递镜像的情况下传递私有名称应该抛出。 如果不回避 const 构造函数的要求(不执行代码!),这很难在 const 构造函数中完成,这可能是 VM 不处理它的原因。它需要在编译器级别进行特殊处理。

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

要获取符号,我认为您需要从对象中获取它。例如

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