Символ с аргументом частного идентификатора
Я хочу создать символ, равный символу частного имени MethodMirror. Однако документация Symbol гласит, что аргумент нового Symbol должен быть действительным общедоступным идентификатором. Если я попытаюсь создать const Symbol('_privateIdentifier')
Редактор дротиков сообщает мне, что оценка этого константного выражения вызовет исключение - хотя программа работает нормально, и я могу использовать ее без каких-либо проблем.
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")
}
Является ли документация / пометка ошибок в редакторе дротиков устаревшей ошибкой из-за устаревшего анализатора дротиков? Или есть планы по обеспечению соблюдения этого публичного требования в будущем? Есть ли другой способ создания уникального идентифицирующего символа, который будет уменьшен до того же символа, что и простое имя объявления
2 ответа
Если он не выбрасывает, то у VM есть ошибка в конструкторе символа const.
Проблема в том, что _s не идентифицирует приватную переменную, не говоря также, к какой библиотеке она принадлежит. Конструктор символа имеет второй аргумент, принимающий LibraryMirror
по этой причине, и передача в частное имя, не передавая при этом в зеркале, должен бросить. Это трудно сделать в конструкторе const, не отступая при этом от требований конструктора const (без выполнения кода!), Поэтому, вероятно, виртуальная машина не справляется с этим. Это должно быть в специальном случае на уровне компилятора.
Вы также найдете, что const Symbol('_s')
это не то же самое, что #_s
, Последний создает закрытый символ для текущей библиотеки, первый (если он запускается) создает не приватный символ с именем "_s", что не очень полезно. Например print(identical(#_s, const Symbol('_s')));
печатает ложь.
Чтобы получить символ, я думаю, вам нужно получить его от объекта. например
reflect(thing).type.declarations.keys.firstWhere(
(x) => MirrorSystem.getName(x) == "_privateThingIWant");