Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.04.2012, 17:31
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 11  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
сможете сюда скинуть рабочий вариант?

Старый 10.04.2012, 17:41
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 12  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы ALPHABET
Все символы которые она содержит, являются разрешенными. В случае если в шаблоне в названии переменной есть символ которые не является разрешенным, например цифра или английская буква в верхнем регистре, то эта переменная не будет воспринята. И замены не произойдет. А вобще скиньте ваш код конкретный, который не работает. Я попробую вам помочь.

А так даже тот код который я скидывал вполне рабочий. Переменные работают для такого объекта прекрасно:
Код AS3:
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;
		}
 
	}
 
}
Использование:
Код AS3:
trace(StringUtils.printfwv("%test% %test1% %test2% %test4% %test5% ", new TestObject()));//Trace: 111 112 113 114 115
Добавлено через 17 минут
единственно нашел ошибку с вылитающим эксепшеном, если в объекте нет такой переменной. Теперь обработка не прекращается, а просто выдается трейс. Ну и переменная остается незамененной. +Добавил в алфавит цифры. Вот исправленный вариант

Код AS3:
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;
		}

Старый 10.04.2012, 22:07
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 13  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
незнаю....несколько раз проверил ваш метод и он не работает у меня(((
кстати, а запись new TestObject() ведь равносильна this, если мы пишем этот код внутри класса TestObject ?

Старый 10.04.2012, 22:38
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 14  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
А зачем всё так сложно, не проще иметь 2 узла xml, а между ними вставлять уже необходимую переменную.

<useVarCount>
<node>У вас осталось</node>
<node>попыток</node>
</useVarCount>
__________________
adobe AS3 manual

Старый 10.04.2012, 22:39
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 15  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
Нашёл проблему: ваш метод не работает, если в строке перед %tries% идёт какойто текст. Как это решить?

Добавлено через 1 минуту
to strangedk - а если у вас таких узлов нужно 10 в строке, будете 10 тегов писать? Это как минимум не удобно

Старый 10.04.2012, 22:46
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 16  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
ага, буду 10 тегов)

Не, ну я просто размышляю простым путём, и ничто не мешает создать тег типа <injectNode> и в него пихать то что должно быть между тегами:

<node1>У вас осталось</node1>
<injectNode>counter</injectNode>
<node2>попыток</node2>

Я знаю что это совсем не гибко, и прекрасно это понимаю.
Но увидев тучу кода выше, я уж и не знаю какой метод лучше.

Хочется - пишите свой парсер, кто ж мешает
__________________
adobe AS3 manual

Старый 10.04.2012, 22:46
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 17  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
так вот эту вещь удалите:
Код AS3:
//быстрая проверка на содержание двух %
			var iof:int = string.indexOf(PREFIX);
			if (iof == NOT_EXIST) {
				return string;
			}else {
				if (string.indexOf(string, iof++) == NOT_EXIST) return string;
			}
			//
Добавлено через 7 минут
strangedk, Извините, конечно, на правах холивара. Но я удивляюсь порой программистам. Вы предлагаете меньше писать кода, но при этом предлагаете решение, которое труднее поддерживать и заранее более уязвимое к человеческому фактору и в плане количества данных гораздо более избыточное?

Старый 10.04.2012, 23:06
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 18  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Я вас прекрасно понимаю. Сам стремлюсь всегда к совершенству, и это замечательно.
Только перебарщивать с преждевременной оптимизацией - зло

И так как мне совершенно не ясны масштабы задачи - я предложил свой вариант, который был применен в одном из моих приложений, буквально с 20 строчками текста.

Если же у вас таких внедрений будет много, тогда разумеется есть смысл изобрести свой парсер.
__________________
adobe AS3 manual

Старый 10.04.2012, 23:12
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 19  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
всем давно известно(а может и не всем?), что "преждевременная оптимизация-это зло" фраза за которую даже Кнут уже извинялся. Так как ее цитирование без контекста, порождает вот такие "аргументы". Преждевременная оптимизация не зло. Забудьте уже про это.

Старый 11.04.2012, 00:02
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 20  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Ага, в приложении которое должно выводить 2 строчки давайте прикрутим locale, ant, внешний logger и еще какой-нибудь фреймверк заюзаем, а-ля robotlegs или parsley.

- так чувствуется разница? )
__________________
adobe AS3 manual

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:08.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.