![]() |
Динамическое обращение к методу toXMLString() экземпляра класса XML.
Друзья и, в чем я очень сомневаюсь, подруги, помогите понять почему не получается динамически обратиться к методу toString(). Вот код:
Код AS3:
Я всегда думал что динамическое обращение работает везде, где работает обычное... Мозг в панике! =((( Ах да, чуть не забыл, выдает вот эту ошибку: Код:
TypeError: Error #1006: value is not a function. |
Интересные виражи мысли)) То есть сначала Вы используете нетипизированный доступ, и тут же, как ни в чем не бывало – ставите скобки, как будто это функция и Вы ее вызываете. Но ведь обманутый Вами компилятор не может гарантировать не только то, что это Function, но даже – что такой член класса вообще есть.
|
Хм интересное поведение. Компилятор конечно гарантировать не может, но мы-то с вами знаем, что такие члены есть, и закомментированные работающие трейсы - тому подтверждение.
А задачу наверняка можно решить и так: Код AS3:
Код AS3:
|
Это все так, но ведь компилятор тут вообще, к сожалению, не при чем. Ошибка происходит на этапе выполнения. Методы вышеупомянутые в классе XML определены (как бы, даже не знаю класса в котором toString() не был бы определен либо унаследован).
Значит проблема в чем-то другом, что-то в данном контексте мешает динамически обращаться к методу! =( Добавлено через 22 минуты GAIKER, Да, выдействительно правы,я как-то не подумал. Первый ваш вариант понравился больше :) Он закрученнее. Однако всеравно хочется разобраться... У кого-то есть идеи? |
Потому что для XML перегружен оператор []. Он действует по следующему принципу: если есть ребенок с именем внутри скобок, то вернуть ссылку на ребенка, если нет ребенка - создать и вернуть ссылку на пустой XMLList, таким образом, если вы явно не вызываете функцию, вы будете создавать / получать ссылку на ребенка.
|
wvxvw, если бы я по случайности только что не нашел верный ответ я бы тоже принял Вашу точку зрения.
Квадратные скобки для экземпляров класса XML действительно играют важную роль и это, я так думаю, является одной из причин того, что для определения всех методов в класах XML и XMLList используется пространство имен AS3. А теперь барабанная дробь... Код AS3:
Код AS3:
Это если кому интересно =) |
Ну так а что вы сделали? Вы же больше не обращаетесь динамически к XML. Вы обращаетесь динамически к пространству имен (т.е. не применяете оператор [] к XML). Ну а с пространством имен он так и работает.
|
Цитата:
Это я все веду к тому, что скобки [] вообще не при чем. Это легко доказывается следующим отрывком кода: Код AS3:
Просто, наверное, причина моего конфуза была в том, что открытые пространства имен и динамическое обращение несовместимы... т.е. когда мы открываем пространство имен (при помощи use namespace), то всем неуточненным идентификаторам на этапе компиляции неявно добавляется приставка в виде: "открытоеПространствоИмен::", однако если неуточненный идентификатор записан при помощи динамического синтаксиса ["какая-тоПеременная"], то приставка не добавляется при компиляции. нужно будет потэстить эту догадку |
> В моем понимании, я обращаюсь к методу toXMLString()
Нет :) в первом случае вы вызываете оператор [] с двумя аргументами XML и строка, и он возвращает вам новый XMLList, а во втором случае вы вызываете оператор [] с двумя аргументами - пространство имен AS3 примененное к объекту XML и строка, и он вам возвращает функцию. псевдокод: Код:
bracketsOperator(xml, "toXMLString") => XMLList |
wvxvw, но ведь в AVM2 нет понятия оператора :)
toXMLString, ["toXMLString"], AS3::toXMLString и AS3::["toXMLString"] - это просто разные QName, которые различаются типом (статический и рантаймовый) и набором неймспейсов (дефолтный и указанный явно). На уровне байткода указатель на функцию в итоге всегда ищется одинаково, эксперимент это подтверждает: Код AS3:
Код:
function str_fla:MainTimeline::str_fla:frame1(): |
| Часовой пояс GMT +4, время: 05:24. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.