我想创建一个与私有(private) 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")
}
dart 编辑器中的文档/错误标记是否是由于过时的 dart 分析器而导致的遗留错误?或者将来有计划执行这一公共(public)要求吗?是否有另一种方法来创建一个唯一的识别符号,该符号将被缩小为与声明的简单名称相同的符号
最佳答案
如果它没有抛出,那么虚拟机在 const Symbol 构造函数中存在错误。
问题是“_s”在没有说明它属于哪个库的情况下无法识别私有(private)变量。由于这个原因,符号构造函数有第二个参数采用 LibraryMirror
,并且传入私有(private)名称而不传入镜像应该抛出异常。
如果不回避 const 构造函数的要求(不执行代码!),在 const 构造函数中很难做到这一点,这可能就是 VM 不处理它的原因。它需要在编译器级别进行特殊处理。
您还会发现 const Symbol('_s')
与 #_s
不同。后者为当前库创建一个私有(private)符号,前者(如果运行)创建一个名为“_s”的非私有(private)符号,这并不是真正有用。例如 print(identical(#_s, const Symbol('_s')));
打印 false。
关于dart - 带有私有(private)标识符参数的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113434/