E4X в ActionScript - PullRequest
       1

E4X в ActionScript

5 голосов
/ 22 декабря 2010

Глядя на реализацию E4X в ActionScript, мне приходит в голову, что им пришлось выяснить, как делать три вещи, которые, я не уверен, можно регулярно выполнять в ActionScript:

Свойства / Получателис префиксом @: var myAttribute = xmlPerson.@name;

Безымянные функции для фильтрации: xmlData.person.(/* predicate */)

лямбда-синтаксис для предикатов: xmlData.person.(@name == "Brian")

Итак, вот мой вопрос: эти однократные возможности (очень похожие на Vector.<>), которые они вставляют только для E4X, поэтому остаются недоступными для нас?Или мы, как разработчики ActionScript, имеем доступ к этим функциям?

В частности, я хотел бы получить доступ к дереву выражений этого лямбда-предиката для моего собственного кода (не привязанного к классам XML втем не мение).

Я понял, что это называется "оператор фильтра" ... но я не уверен, как его использовать.Не уверен, что смогу ... так как ActionScript не допускает перегрузки операторов: (

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Насколько я знаю, невозможно использовать синтаксис E4X для других типов объектов. Это действительно грустно, потому что в этом есть большой потенциал; особенно синтаксис lamdba.

1 голос
/ 06 января 2011

Я знаю, что опоздал, но, Мозг, похоже, что операторы фильтров поддерживаются в AS3 !!

Оформить эту ошибку я получил:

TypeError: Error #1123: Filter operator not supported on type XYZ

В этой строке кода:

object.(getChildByName("image") as Sprite).addChild(img);

Ну .. Полагаю, мы выясним все остальное ...

1 голос
/ 22 декабря 2010

Я думаю, что вам нужен класс Proxy. Механизм этого класса довольно интересен, он позволяет вам обрабатывать динамический доступ к несуществующим, но алгоритмически определяемым свойствам. Для этого вы наследуете класс flash.utils.Proxy.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/Proxy.html

Динамическая логика получения / установки проста в реализации. Однако доступ к атрибуту (@) и лямбда-синтаксис сложны. Получатели прокси по какой-то причине не видят символ @, а методы фильтрации приводят к ошибкам во время выполнения. Вы можете увидеть их ниже:

package {
    import flash.display.Sprite;

    public class ProxyTest extends Sprite {
        public function ProxyTest() {
            var obj:ProxyObject = new ProxyObject();

            trace(obj.testingDefault); // Invokes default logic.
            trace(obj.@testingAttributes); // Invokes default logic. :(
            trace(obj["(@testingLambda == 'testing')"]); // Invokes lambda logic.
            trace(obj.filter("@testing == 'testing'")); // Just an idea

            trace(obj.(@testing = "testing")); // Throws Error #1123: Filter operator not supported 
        }
    }
}

import flash.utils.Proxy;
import flash.utils.flash_proxy;

dynamic class ProxyObject extends Proxy {

    public function ProxyObject() {
    }

    override flash_proxy function callProperty(propName:*, ... args):* {
        var name:String = propName.toString();

        switch (name.charAt(0)) {
            case '(':
                trace("Lambda logic.");
                break;
            case '@':
                trace("Attribute logic.");
                break;
            default:
                trace("Default logic.");
                break;
        }

        return "CALL: " + propName;
    }

    override flash_proxy function getProperty(propName:*):* {
        var name:String = propName.toString();

        switch (name.charAt(0)) {
            case '(':
                trace("Lambda logic.");
                break;
            case '@':
                trace("Attribute logic.");
                break;
            default:
                trace("Default logic.");
                break;
        }

        return "GET: " + propName;
    }

    override flash_proxy function setProperty(propName:*, value:*):void {
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...