![]() |
|
||||||||||
|
|||||
|
сможете сюда скинуть рабочий вариант?
![]() |
|
|||||
|
на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы ALPHABET Все символы которые она содержит, являются разрешенными. В случае если в шаблоне в названии переменной есть символ которые не является разрешенным, например цифра или английская буква в верхнем регистре, то эта переменная не будет воспринята. И замены не произойдет. А вобще скиньте ваш код конкретный, который не работает. Я попробую вам помочь. А так даже тот код который я скидывал вполне рабочий. Переменные работают для такого объекта прекрасно: package { /** * ... * @author Shirobok Pavel (ramshteks@gmail.com) */ public class TestObject { public var test:String = "111"; public var test1:int=112; public var test2:*= 113; public function TestObject() { } public function get test4():String { return "114" } public function get test5():int { return 115; } } } trace(StringUtils.printfwv("%test% %test1% %test2% %test4% %test5% ", new TestObject()));//Trace: 111 112 113 114 115 единственно нашел ошибку с вылитающим эксепшеном, если в объекте нет такой переменной. Теперь обработка не прекращается, а просто выдается трейс. Ну и переменная остается незамененной. +Добавил в алфавит цифры. Вот исправленный вариант static public function printfwv(string:String, vars:Object):String { if (vars == null) return string; const NOT_EXIST:int = -1; const ALPHABET:String = "qwertyuiopasdfghjklzxcvbnm_1234567890"; 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) != NOT_EXIST) { var_buff += c; }else { if (c == PREFIX) { var correct_object:Boolean = true; try { vars[var_buff]; if (vars[var_buff] == undefined) correct_object = false; }catch (e:Error) { correct_object = false; trace("warning: was catched exception when using source-object:" + e.message); } if (!correct_object){ 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; } |
|
|||||
|
незнаю....несколько раз проверил ваш метод и он не работает у меня(((
кстати, а запись new TestObject() ведь равносильна this, если мы пишем этот код внутри класса TestObject ? |
|
|||||
|
А зачем всё так сложно, не проще иметь 2 узла xml, а между ними вставлять уже необходимую переменную.
<useVarCount> <node>У вас осталось</node> <node>попыток</node> </useVarCount>
__________________
adobe AS3 manual |
|
|||||
|
Нашёл проблему: ваш метод не работает, если в строке перед %tries% идёт какойто текст. Как это решить?
Добавлено через 1 минуту to strangedk - а если у вас таких узлов нужно 10 в строке, будете 10 тегов писать? Это как минимум не удобно |
|
|||||
|
ага, буду 10 тегов)
Не, ну я просто размышляю простым путём, и ничто не мешает создать тег типа <injectNode> и в него пихать то что должно быть между тегами: <node1>У вас осталось</node1> <injectNode>counter</injectNode> <node2>попыток</node2> Я знаю что это совсем не гибко, и прекрасно это понимаю. Но увидев тучу кода выше, я уж и не знаю какой метод лучше. Хочется - пишите свой парсер, кто ж мешает
__________________
adobe AS3 manual |
|
|||||
|
так вот эту вещь удалите:
//быстрая проверка на содержание двух % var iof:int = string.indexOf(PREFIX); if (iof == NOT_EXIST) { return string; }else { if (string.indexOf(string, iof++) == NOT_EXIST) return string; } // strangedk, Извините, конечно, на правах холивара. Но я удивляюсь порой программистам. Вы предлагаете меньше писать кода, но при этом предлагаете решение, которое труднее поддерживать и заранее более уязвимое к человеческому фактору и в плане количества данных гораздо более избыточное? |
|
|||||
|
Я вас прекрасно понимаю. Сам стремлюсь всегда к совершенству, и это замечательно.
Только перебарщивать с преждевременной оптимизацией - зло И так как мне совершенно не ясны масштабы задачи - я предложил свой вариант, который был применен в одном из моих приложений, буквально с 20 строчками текста. Если же у вас таких внедрений будет много, тогда разумеется есть смысл изобрести свой парсер.
__________________
adobe AS3 manual |
|
|||||
|
всем давно известно(а может и не всем?), что "преждевременная оптимизация-это зло" фраза за которую даже Кнут уже извинялся. Так как ее цитирование без контекста, порождает вот такие "аргументы". Преждевременная оптимизация не зло. Забудьте уже про это.
|
|
|||||
|
Ага, в приложении которое должно выводить 2 строчки давайте прикрутим locale, ant, внешний logger и еще какой-нибудь фреймверк заюзаем, а-ля robotlegs или parsley.
- так чувствуется разница? )
__________________
adobe AS3 manual |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:08. |
|
|
« Предыдущая тема | Следующая тема » |
|
|