我想创建一个与私有 MethodMirror 的简单名称相同的符号。但是,Symbol 的文档指出 new 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")
}
dart 编辑器中的文档/错误标记是否是由于过时的 dart 分析器而导致的遗留错误?或者将来有计划执行这一公共要求吗?是否有另一种方法来创建一个唯一的识别符号,该符号将被缩小为与声明的简单名称相同的符号
如果它没有抛出,那么虚拟机在 const Symbol 构造函数中存在错误。
问题是“_s”在没有说明它属于哪个库的情况下无法识别私有变量。符号构造函数有第二个参数,采用LibraryMirror
因此,如果传入私有名称而不传入镜像,则应该抛出异常。
如果不回避 const 构造函数的要求(不执行代码!),在 const 构造函数中很难做到这一点,这可能就是 VM 不处理它的原因。它需要在编译器级别进行特殊处理。
你还会发现const Symbol('_s')
不等于#_s
。后者为当前库创建一个私有符号,前者(如果运行)创建一个名为“_s”的非私有符号,这并不是真正有用。例如print(identical(#_s, const Symbol('_s')));
打印错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)