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

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

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

Регистрация: Jan 2010
Сообщений: 28
По умолчанию hurlant eval, чудеса с областью видимости в as3

Код AS3:
package com
{
	public class Util
	{
		public static function print(arg:String):void
		{
			trace(arg);
		}
	}
}


далее начинаются чудесаааатые чудеса:

Код AS3:
import com.Util;
...
Util.print('test1');
 
var src:String =
"namespace COM = 'com';\n" +
"use namespace COM;\n" +
"Util.print('test2');";
 
ByteLoader.loadBytes(esc.eval(src));
Получаю в трейсе:
Цитата:
test1
test2

Код AS3:
import com.Util;
...
//Util.print('test1');
 
var src:String =
"namespace COM = 'com';\n" +
"use namespace COM;\n" +
"Util.print('test2');";
 
ByteLoader.loadBytes(esc.eval(src));
Получаю:
Цитата:
ReferenceError: Error #1065: Переменная Util не определена.
То есть, если я не использовал эту функцию ранее - она оказывается невидна.
__________________
GAE + Flex = CyoaWare =)

Старый 22.09.2011, 18:14
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
да вобщем нет тут ничего чудесного: если на функцию\класс нет ссылок в коде, то логично, что их нет и во флешке, не ?

Старый 22.09.2011, 18:17
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 3  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Никаких чудес, в евале можно использовать только те классы, что вы использовали просто так, иначе их упоминаний не будет в заголовках swf файла( точнее abc файла) и они не могут быть использованы в динамике. Попробуйте получить имя этого класса через getDefinitionByName и у вас тоже ничего не получится. Для того чтоб класс можно было использовать достаточно его просто упомянуть, например так:
Код AS3:
Util;
Это происходит потому что esc не собирает новую флешку с новыми хедерами, а исполняет код сам, тамарином.

Добавлено через 30 секунд
блин, silin опередил
__________________
:)

Старый 22.09.2011, 18:17
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Нет, это не область видимости, это класс Util не скомпилировался (т.как незачем) второй раз. Если класс не использовать, то компилятор его не прилинкует. А eval() скорее всего не занимается поиском (да и негде ему...) существующих классов, он просто скомпилировал код типа getproperty symboltableoffset XX ("Util") ну а когда оно выполнилось, оказалось, что строка из таблицы символов не относится ни к какому из известных объектов.
__________________
Hell is the possibility of sanity

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

Регистрация: Jan 2010
Сообщений: 28
silin, Aquahawk, wvxvw - большое спасибо! =)



Злоупотреблю вашей добротой к моей глупости и моему невежеству, и спрошу ещё вот какую вещь:

У меня есть ArrayCollection из объектов, свойства которых я использую в коде, который я потом eval'ю, следующим образом:

Код AS3:
var code:String = "";
for (var i:int = 0; i < attributes.length; i++)
{
	if (attributes[i].type == "String")
	{
		code += "var " + a[i].id + ":String = \"" + a[i].value + "\";\n";
	}
	else
	{
		code += "var " + a[i].id + ":int = " + a[i].value + ";\n";
	}
}
code += mycode; // добавление кода, который в ходе своей работы изменяет значения переменных, добавленных в код выше
Как лучше, загонять значения этих переменных в конце кода?
__________________
GAE + Flex = CyoaWare =)

Старый 22.09.2011, 19:54
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
непонятно тебя
трудно угадать будет ли кому-то лучше, если загонять в конце

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

Регистрация: Jan 2010
Сообщений: 28
Цитата:
Сообщение от silin Посмотреть сообщение
непонятно тебя
Попробую перефразировать.

В строковой переменной code я формирую текст кода, который потом выполняю с помощью esc.eval(code).

У меня есть некий ArrayCollection, каждый элемент которого является объектом с вот такой структурой: {type: "Int", id: "zozo", value: 25}

Я добавляю объекты из этого ArrayCollection, в формируемый мной текст кода, в виде инициализации переменных:

Код AS3:
for (var i:int = 0; i < myAC.length; i++)
{
	if (myAC[i].type == "String")
	{
		code += "var " + myAC[i].id + ":String = \"" + myAC[i].value + "\";\n";
	}
	else
	{
		code += "var " + myAC[i].id + ":int = " + myAC[i].value + ";\n";
	}
}
 
// в результате, {type: "Int", id: "zozo", value: 25} попадает в код в виде var zozo:int = 25;

Далее в code добавляется код, который изменяет значения проинициализированных таким образом переменных.
Теперь вот думаю, что нужно добавить в конце code, что бы изменения этих переменных адекватно отразились на содержимом элементов myAC.


Цитата:
Сообщение от silin Посмотреть сообщение
трудно угадать будет ли кому-то лучше, если загонять в конце
=))

Добавлено через 20 минут
Кажись нашол.

Решением является такой код:
Код AS3:
for (i = 0; i < myAC.length; i++)
{
	code += "Util.set(" + i + ", " + myAC[i].id + ");\n"
}
 
...
 
 
public static function set(arg1:int, arg2:*):void
{
	myAC[arg1].value = arg2;
}
__________________
GAE + Flex = CyoaWare =)


Последний раз редактировалось maksimov; 22.09.2011 в 20:44.
Старый 22.09.2011, 22:06
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Нашел? Ай, молодец.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Теги
hurlant eval
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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