![]() |
"Метки-переменных" в XML
Такой вопрос: есть ли такая фича при написании строки в xml как то указывать не текст а "метку" которая будет говорить компилятору, чтобы он искал в пределах данного класса переменную и подставлял её вместо метки в результирующую строку? Или это можно сделать только при помощи методов класса String?
|
Вас непонятно. Вы компилируете xml?
|
я загружаю строку из xml, но хочу чтобы в ней содержалась ссылка на переменную которая есть у меня в классе, в котором я эту строку использую. Т.е. вот строка из xml
"Попробуйте ещё раз! У вас осталось %tries% попытки!" Переменная tries у меня объявлена в классе сверху. Хочется чтобы получилось как то вот так: "Попробуйте ещё раз! У вас осталось" + tries + "попытки!" |
Код AS3:
EDIT: А... XML уже готовый? Ну тогда нет, нет ничего специально заготовленного, надо самому. |
регулярным выражением, через replace ? А как перевести в строку имя переменной?
|
Переменные бывают связаными в лексическом окружении и статическом / динамически (lexical binding and static / dynamic binding). Первый случай - внутри функции аргументы и локальные переменные связаны лексически с контекстом функции. Имена таких переменных не хранятся в скомпилированом коде. Статически / динамически связанные переменные - например, поля класса, их, естественно, можно получить как объект[имя свойства], т.как имена хранятся в скомпилированом коде.
Так что если речь о лексической привязке - то только вручную, типа: string.replace(/variable/g, variable); |
Ну при таком раскладе тебе нужно что-то вроде своего мета-языка небольшого изобрести. То есть смотри как - есть 2 вещи:
- xml с заготовками - хранилище данных (оттуда берем данные для подстановки) так вот, имея xml вида: Код AS3:
То есть берем наше хранилище, берем у него свойство player, у того что получили берем свойство numTries. То что получили - кладем в xml вместо выражения [player.numTries]. Ну и выводим результат уже с подстановкой. Кстати, очень крутая система, туда же можно прикрутить условия, вычисления и локализацию. Даже вызовы методов можно. Главное задать "контекст исполнения" - в рассмотренном выше примере это хранилище данных. |
вот у темя есть нужная для вас функция:
Код AS3:
Добавлено через 49 секунд правда никакой привязки к xml нет, поэтому из xml вам самому придется выдрать строку-шаблон |
о, супер, большое спасибо ramshteks! Сейчас попробую!))
Добавлено через 21 минуту чтото не пашит((( Засунул вашу функцию в свой класс MyUtils, вызываю следующим образом Код AS3:
|
метод писался под такое использование:
printfwv("a123 %tries% vsvs", {tries:"TEST String"}); Для вашего варианта, даже не проверялось, так что подсказать не могу тоесть должен работать вот такой вариант: printfwv("a123 %tries% vsvs", {tries:String(this.tries)}); Добавлено через 10 минут Я прошу прощения, сейчас обнаружил, что функция действительно не корректно работает |
сможете сюда скинуть рабочий вариант?:)
|
на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы ALPHABET Все символы которые она содержит, являются разрешенными. В случае если в шаблоне в названии переменной есть символ которые не является разрешенным, например цифра или английская буква в верхнем регистре, то эта переменная не будет воспринята. И замены не произойдет. А вобще скиньте ваш код конкретный, который не работает. Я попробую вам помочь. А так даже тот код который я скидывал вполне рабочий. Переменные работают для такого объекта прекрасно: Код AS3:
Код AS3:
единственно нашел ошибку с вылитающим эксепшеном, если в объекте нет такой переменной. Теперь обработка не прекращается, а просто выдается трейс. Ну и переменная остается незамененной. +Добавил в алфавит цифры. Вот исправленный вариант Код AS3:
|
незнаю....несколько раз проверил ваш метод и он не работает у меня(((
кстати, а запись new TestObject() ведь равносильна this, если мы пишем этот код внутри класса TestObject ? |
А зачем всё так сложно, не проще иметь 2 узла xml, а между ними вставлять уже необходимую переменную.
<useVarCount> <node>У вас осталось</node> <node>попыток</node> </useVarCount> |
Нашёл проблему: ваш метод не работает, если в строке перед %tries% идёт какойто текст. Как это решить?
Добавлено через 1 минуту to strangedk - а если у вас таких узлов нужно 10 в строке, будете 10 тегов писать? Это как минимум не удобно |
ага, буду 10 тегов)
Не, ну я просто размышляю простым путём, и ничто не мешает создать тег типа <injectNode> и в него пихать то что должно быть между тегами: <node1>У вас осталось</node1> <injectNode>counter</injectNode> <node2>попыток</node2> Я знаю что это совсем не гибко, и прекрасно это понимаю. Но увидев тучу кода выше, я уж и не знаю какой метод лучше. Хочется - пишите свой парсер, кто ж мешает |
так вот эту вещь удалите:
Код AS3:
strangedk, Извините, конечно, на правах холивара. Но я удивляюсь порой программистам. Вы предлагаете меньше писать кода, но при этом предлагаете решение, которое труднее поддерживать и заранее более уязвимое к человеческому фактору и в плане количества данных гораздо более избыточное? |
Я вас прекрасно понимаю. Сам стремлюсь всегда к совершенству, и это замечательно.
Только перебарщивать с преждевременной оптимизацией - зло И так как мне совершенно не ясны масштабы задачи - я предложил свой вариант, который был применен в одном из моих приложений, буквально с 20 строчками текста. Если же у вас таких внедрений будет много, тогда разумеется есть смысл изобрести свой парсер. |
всем давно известно(а может и не всем?), что "преждевременная оптимизация-это зло" фраза за которую даже Кнут уже извинялся. Так как ее цитирование без контекста, порождает вот такие "аргументы". Преждевременная оптимизация не зло. Забудьте уже про это.
|
Ага, в приложении которое должно выводить 2 строчки давайте прикрутим locale, ant, внешний logger и еще какой-нибудь фреймверк заюзаем, а-ля robotlegs или parsley.
- так чувствуется разница? ) |
strangedk, вы путаете кислое с длинным. Если будет нужно иметь несколько сборок этого приложения - заюзаем ант. Если необходимо будет выяснять увидел пользователь текст или нет то внешний логгер. Если текст должен на 100 языках сделаем локализацию. Даже если на начальном этапе нужно будет всего один, а 99 появятся позже.
Есть задача. И если вы не понимаете, что задача это не только "здесь и сейчас", а еще и "завтра, послезавтра и через месяц", то вы обречены бороться со своевременной неоптимизацией. Кроме всего переходить на частные крайности вроде вашего примера, просто не корректно и вы надеюсь это понимаете. |
Ну если вернуться к сути вопроса - то повторюсь, что я совсем не в курсе масштабов задания.
Если нужно по быстрому, "сделали-забыли", и не сильно заморачиваясь - я бы не брался писать парсер подставляемых переменных. Это не оправданно. Если проект интересный, и перспективный - то конечно и самому хочется сделать его максимально гибким. И думаю я бы не остановился на XML. |
Код AS3:
|
Dukobpa3, хорошее решение, тоже думал в эту сторону.
Я думаю добавил бы связку name-value в Dictionary, и чтобы по имени сразу можно было обратиться к значению. |
Dictionary может не подойти, нужен Object, у него ключи строковые
|
Ну вообще у нас так же сделано как вот в этом варианте.
Просто получаем строку, и обжект с именами для замены. |
Цитата:
|
Dukobpa3, strangedk, решение с регекспами у меня тоже есть. Но оно немного для других целей. Оно гораздо проще, но и подходит далеко не всегда:
Код AS3:
|
Цитата:
|
Теперь возник вопрос, а можно ли что-то подобное сделать но с функциями?)) Т.е. чтобы вместо текста выполнялся метод выбранного объекта))
|
ну сделай, че.
|
Цитата:
|
Цитата:
Добавлено через 1 минуту Цитата:
|
| Часовой пояс GMT +4, время: 14:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.