![]() |
|
||||||||||
|
|||||
|
Такой вопрос: есть ли такая фича при написании строки в xml как то указывать не текст а "метку" которая будет говорить компилятору, чтобы он искал в пределах данного класса переменную и подставлял её вместо метки в результирующую строку? Или это можно сделать только при помощи методов класса String?
|
|
|||||
|
я загружаю строку из xml, но хочу чтобы в ней содержалась ссылка на переменную которая есть у меня в классе, в котором я эту строку использую. Т.е. вот строка из xml
"Попробуйте ещё раз! У вас осталось %tries% попытки!" Переменная tries у меня объявлена в классе сверху. Хочется чтобы получилось как то вот так: "Попробуйте ещё раз! У вас осталось" + tries + "попытки!" |
|
|||||
|
Modus ponens
|
?
EDIT: А... XML уже готовый? Ну тогда нет, нет ничего специально заготовленного, надо самому.
__________________
Hell is the possibility of sanity |
|
|||||
|
регулярным выражением, через replace ? А как перевести в строку имя переменной?
|
|
|||||
|
Modus ponens
|
Переменные бывают связаными в лексическом окружении и статическом / динамически (lexical binding and static / dynamic binding). Первый случай - внутри функции аргументы и локальные переменные связаны лексически с контекстом функции. Имена таких переменных не хранятся в скомпилированом коде. Статически / динамически связанные переменные - например, поля класса, их, естественно, можно получить как объект[имя свойства], т.как имена хранятся в скомпилированом коде.
Так что если речь о лексической привязке - то только вручную, типа: string.replace(/variable/g, variable);
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 10.04.2012 в 15:00. |
|
|||||
|
Ну при таком раскладе тебе нужно что-то вроде своего мета-языка небольшого изобрести. То есть смотри как - есть 2 вещи:
- xml с заготовками - хранилище данных (оттуда берем данные для подстановки) так вот, имея xml вида: Вот тут нужно вычленить все "выражения" (то что внутри []-скобочек) и скомпилировать их. Копиляция - довольно простая вешь - есть хранилище данных, есть имя свойства (указанное как [player.numTries]). То есть берем наше хранилище, берем у него свойство player, у того что получили берем свойство numTries. То что получили - кладем в xml вместо выражения [player.numTries]. Ну и выводим результат уже с подстановкой. Кстати, очень крутая система, туда же можно прикрутить условия, вычисления и локализацию. Даже вызовы методов можно. Главное задать "контекст исполнения" - в рассмотренном выше примере это хранилище данных.
__________________
...вселенская грусть |
|
|||||
|
вот у темя есть нужная для вас функция:
static public function printfwv(string:String, vars:Object):String { if (vars == null) return string; const NOT_EXIST:int = -1; const ALPHABET:String = "qwertyuiopasdfghjklzxcvbnm_"; const S_TEXT:int = 1; const S_VAR:int = 2; const PREFIX:String = "%"; //быстрая проверка на содержание двух % var iof:int = string.indexOf(PREFIX); if (iof == NOT_EXIST) { return string; }else { if (string.indexOf(string, iof++) == NOT_EXIST) return string; } // var src:String = string; var buffer:String = ""; var state:int = S_TEXT; var var_buff:String = ""; var c:String; for (var i:int = 0, len:int = src.length; i < len; i++) { c = src.charAt(i); switch(state) { case S_TEXT: if (PREFIX == c) { state = S_VAR; }else { buffer += c; } break; case S_VAR: if (ALPHABET.indexOf(c) != -1) { var_buff += c; }else { if (c == PREFIX) { if (vars[var_buff] == undefined) { buffer += PREFIX + var_buff; var_buff = ""; i--; state = S_TEXT; }else { buffer += vars[var_buff]; } }else{ buffer += PREFIX + var_buff + c; } var_buff = ""; state = S_TEXT; } break; } } if (state == S_VAR) { buffer += PREFIX + var_buff; } return buffer; } Добавлено через 49 секунд правда никакой привязки к xml нет, поэтому из xml вам самому придется выдрать строку-шаблон |
|
|||||
|
о, супер, большое спасибо ramshteks! Сейчас попробую!))
Добавлено через 21 минуту чтото не пашит((( Засунул вашу функцию в свой класс MyUtils, вызываю следующим образом var tries в классе есть, пробовал её делать и публичной и статической, но всё равно возвращает не изменённую строку(( |
|
|||||
|
метод писался под такое использование:
printfwv("a123 %tries% vsvs", {tries:"TEST String"}); Для вашего варианта, даже не проверялось, так что подсказать не могу тоесть должен работать вот такой вариант: printfwv("a123 %tries% vsvs", {tries:String(this.tries)}); Добавлено через 10 минут Я прошу прощения, сейчас обнаружил, что функция действительно не корректно работает |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:41. |
|
|
« Предыдущая тема | Следующая тема » |
|
|