Есть ли способ скрывать символ в строке?
Например, VariableMirror возвращает символы вместо строк. Есть ли способ преобразования символа в строку, поэтому я могу напечатать все имена переменных класса?
Есть ли способ скрывать символ в строке?
Например, VariableMirror возвращает символы вместо строк. Есть ли способ преобразования символа в строку, поэтому я могу напечатать все имена переменных класса?
Используйте MirrorSystem.getName():
import 'dart:mirrors';
void main() {
var sym = new Symbol('test');
print(MirrorSystem.getName(sym));
}
Выводится:
test
Оказывается, существует простое решение
print(MirrorSystem.getName(symbol));
печатает
SomeName
см. также: https://code.google.com/p/dart/issues/detail?id=17471
EDIT
Интересный комментарий к проблеме, связанной выше из @lrn
"Трудно использовать" нарочно. Символы могут быть уменьшены dart2js, и поиск их исходного имени осуществляется только через зеркальную систему. Это позволяет dart2js знать, используется ли эта функция вообще, и не включать таблицу переводов, если она не нужна. В общем, я рекомендую кодирование таким образом, что не нужно преобразовывать символы в строки, если это вообще возможно. Рассматривайте их как непрозрачные жетоны и сравнивайте их только с другими токенами.
пакет дыма предоставляет услугу для этого, которая преобразуется в код своим трансформатором таким образом, который также работает в мини-JavaScript. symbolToName()
и nameToSymbol()
.
Я тоже собираюсь ответить на этот вопрос. Я не могу использовать 'dart: mirror' в моем пакете, поэтому используя ниже:
String s = new Symbol('hi').toString();
s = s.substring(8,pn.length-2);
Выглядит ужасно, но у него все получается. Возможно, проблема с производительностью.
Не думал об этом, спасибо.
Даже если бы это сработало сейчас, есть шансы на поломку в будущем, поэтому я думаю, что "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`
Пример кода:
// 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!");
}
}