带有私有标识符参数的符号
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");
我想创建一个与私有 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");