Символ с аргументом частного идентификатора

Я хочу создать символ, равный символу частного имени 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");
Другие вопросы по тегам