Подтвердить что ты не робот

Преобразование символа в строку

Есть ли способ скрывать символ в строке?

Например, VariableMirror возвращает символы вместо строк. Есть ли способ преобразования символа в строку, поэтому я могу напечатать все имена переменных класса?

4b9b3361

Ответ 1

Используйте MirrorSystem.getName():

import 'dart:mirrors';

void main() {
  var sym = new Symbol('test');
  print(MirrorSystem.getName(sym));
}

Выводится:

test

Ответ 2

Оказывается, существует простое решение

print(MirrorSystem.getName(symbol));

печатает

SomeName

см. также: https://code.google.com/p/dart/issues/detail?id=17471

EDIT

Интересный комментарий к проблеме, связанной выше из @lrn

"Трудно использовать" нарочно. Символы могут быть уменьшены dart2js, и поиск их исходного имени осуществляется только через зеркальную систему. Это позволяет dart2js знать, используется ли эта функция вообще, и не включать таблицу переводов, если она не нужна. В общем, я рекомендую кодирование таким образом, что не нужно преобразовывать символы в строки, если это вообще возможно. Рассматривайте их как непрозрачные жетоны и сравнивайте их только с другими токенами.

пакет дыма предоставляет услугу для этого, которая преобразуется в код своим трансформатором таким образом, который также работает в мини-JavaScript. symbolToName() и nameToSymbol().

Ответ 3

Я тоже собираюсь ответить на этот вопрос. Я не могу использовать 'dart: mirror' в моем пакете, поэтому используя ниже:

String s = new Symbol('hi').toString();
s = s.substring(8,pn.length-2);

Выглядит ужасно, но у него все получается. Возможно, проблема с производительностью.

Изменить:

"Шанс - это великие вещи, которые ломаются в мини-JS. Строго обескуражен!" Гюнтера Цохбауэра

Не думал об этом, спасибо.
Даже если бы это сработало сейчас, есть шансы на поломку в будущем, поэтому я думаю, что "toString()" лучше избегать.

Подтверждено:

Warning: 'hi=' is used reflectively but not in MirrorsUsed. This will break minified code.index.bootstrap.initialize.dart.js:7612 
Warning: 'hi' is used reflectively but not in MirrorsUsed. This will break minified code`

Ответ 4

Пример кода:

// Listen for App changes so we can do some things.
app.changes.listen((List<ChangeRecord> records) {
  PropertyChangeRecord record = records[0] as PropertyChangeRecord;
  String changedValue = MirrorSystem.getName(record.name);

  if (changedValue == "pageTitle") {
    print("$changedValue changed!");
  }
}