首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >E4X in ActionScript

E4X in ActionScript
EN

Stack Overflow用户
提问于 2010-12-22 11:04:51
回答 3查看 425关注 0票数 5

看看E4X在ActionScript中的实现,我突然意识到,他们必须想出如何做我不确定能在ActionScript中定期完成的三件事情:

属性/Getters前缀为@: var myAttribute = xmlPerson.@name;

用于过滤的无名称函数: xmlData.person.(/* predicate */)

谓词的lambda语法: xmlData.person.(@name == "Brian")

因此,我的问题是:这些仅仅是一次性的功能(很像Vector.<>),它们只是为E4X而投入,从而使我们望而却步?或者,作为ActionScript开发人员,我们是否可以访问这些特性?

更具体地说,我希望自己的代码能够访问lambda谓词的表达式树(而不是以任何方式绑定到XML类)。

我想这叫“过滤器操作员”..。但我不知道如何利用它。不确定我能不能..。因为ActionScript不允许操作符重载:(

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-22 17:44:05

据我所知,不可能为其他类型的对象利用E4X语法。这真的很可悲,因为它有很大的潜力,尤其是lamdba语法。

票数 1
EN

Stack Overflow用户

发布于 2010-12-22 13:47:40

我想你需要的是代理类。这个类的机制非常有趣,允许您处理对不存在但算法上可定义的属性的动态访问。为了做到这一点,您可以对flash.utils.Proxy类进行子类化。

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

动态getter / setter逻辑易于实现。但是,属性(@)访问和lambda语法是很棘手的。由于某种原因,代理getter看不到@字符,而筛选方法会导致运行时错误。你可以在下面看到它们:

代码语言:javascript
复制
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 {
    }

}
票数 1
EN

Stack Overflow用户

发布于 2011-01-06 20:37:20

我知道我迟到了,但是大脑,看来AS3支持过滤器操作符!

检查我得到的错误:

代码语言:javascript
复制
TypeError: Error #1123: Filter operator not supported on type XYZ

在这一行代码中:

代码语言:javascript
复制
object.(getChildByName("image") as Sprite).addChild(img);

好吧..。我想我们应该找出剩下的..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4508509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档