Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 带有私有标识符参数的符号_Dart_Symbols_Dart Editor_Dart Analyzer - Fatal编程技术网

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

Dart 带有私有标识符参数的符号,dart,symbols,dart-editor,dart-analyzer,Dart,Symbols,Dart Editor,Dart Analyzer,我想创建一个与私有MethodMirror的simplename相等的符号。但是,Symbol的文档说明新Symbol的参数必须是有效的公共标识符。如果我尝试创建一个常量符号(“u privateIdentifier”)dart编辑器会通知我,对该常量表达式的求值将引发异常-尽管程序运行良好,并且我能够使用它而不会出现任何问题 void main(){ //在省道编辑器中标记了错误,但运行正常。 常量s=常量符号(“U s”); 打印;//符号(“_”); } 镜像系统似乎使用了符号 导入“d

我想创建一个与私有MethodMirror的simplename相等的符号。但是,Symbol的文档说明新Symbol的参数必须是有效的公共标识符。如果我尝试创建一个
常量符号(“u privateIdentifier”)
dart编辑器会通知我,对该常量表达式的求值将引发异常-尽管程序运行良好,并且我能够使用它而不会出现任何问题

void main(){
//在省道编辑器中标记了错误,但运行正常。
常量s=常量符号(“U s”);
打印;//符号(“_”);
}
镜像系统似乎使用了符号

导入“dart:mirrors”;
甲级{
_privateMethod(){}
}
void main(){
var classMirror=reflect(new ClassA()).type;
classMirror.declarations.keys.forEach(打印);
//符号(“私有方法”)、符号(“A类”)
}

dart编辑器中的文档/错误标记是否是由于过时的dart分析器造成的遗留错误?还是有计划在将来强制执行这一公共要求?是否有其他方法可以创建一个唯一的标识符号,该符号将缩小为与声明的简单名称相同的符号

如果它没有抛出,那么VM在const symbol构造函数中有一个bug

问题是“_s”在没有说明私有变量所属的库的情况下不能识别它。由于这个原因,符号构造函数还有第二个参数采用
LibraryMirror
,传入私有名称而不传入镜像应该抛出。 在const构造函数中,如果不绕过const构造函数的要求(没有执行的代码!),很难做到这一点,这可能就是VM无法处理它的原因。它需要在编译器级别进行特殊的大小写


您还将发现
常量符号(“u s”)
#u s
不同。后者为当前库创建一个私有符号,前者(如果它运行)创建一个名为“_s”的非私有符号,这不是真正有用的。例如
print(相同(#u s,常量符号(#u s'))打印错误。

要获取符号,我认为您需要从对象获取它。e、 g

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

是否可能有与顶级setter方法相同的符号文字?据我所知,setter符号总是以“=”结尾,但它看起来像是将#x=标记为[#x,=]。setter
符号不能使用符号文字创建,但可以使用
常量符号(“x=)
创建。这就是问题所在。这使得创建私有setter符号有点困难,如果它不必是常量,最简单的方法可能是使用泄漏
调用.memberName
符号的
noSuchMethod
创建对象。