Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 ActionScript中的E4X_Actionscript 3 - Fatal编程技术网

Actionscript 3 ActionScript中的E4X

Actionscript 3 ActionScript中的E4X,actionscript-3,Actionscript 3,看看ActionScript中的E4X实现,我突然想到,他们必须找出如何在ActionScript中定期完成三件事,我不确定: 前缀为@: var myAttribute=xmlPerson@name 用于筛选的无名函数: xmlData.person.(/*谓词*/) 谓词的lambda语法: xmlData.person.(@name==“Brian”) 所以我的问题是:这些只是一次性的功能(很像Vector.),它们只是为E4X提供的,因此我们无法获得?或者,作为ActionScript开

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

前缀为@:
var myAttribute=xmlPerson@name

用于筛选的无名函数:
xmlData.person.(/*谓词*/)

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

所以我的问题是:这些只是一次性的功能(很像
Vector.
),它们只是为E4X提供的,因此我们无法获得?或者,作为ActionScript开发人员,我们是否可以访问这些功能

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


我发现这叫做“过滤算子”。。。但我不知道如何驾驭它。我不确定我能不能。。。由于ActionScript不允许运算符重载:(

我认为您需要的是代理类。该类的机制非常有趣,允许您处理对不存在但可通过算法定义的属性的动态访问。为此,您需要将flash.utils.Proxy类划分为子类

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

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 {
    }

}

据我所知,不可能将E4X语法用于其他类型的对象。这真的很遗憾,因为它有很大的潜力;特别是lamdba语法。

我知道我迟到了,但是Brain,似乎AS3中支持过滤器操作符

签出我得到的错误:

TypeError: Error #1123: Filter operator not supported on type XYZ
在这一行代码中:

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

嗯..我想我们可以解决剩下的问题..

在您的示例之后,我想到的as3中唯一的东西是元数据标记:支持筛选运算符!有关详细信息,请参阅我的答案…代理类很酷,我使用它做了很多事情,但在这里它买不到多少东西。对于类似lambda的表达式,我考虑只发送一个像您建议的那样输入字符串…
“data.prop==true”
但是我没有进行所有基于编译器的检查,需要一个eval(某种类型)。此时,我宁愿键入
函数(data):Boolean{return data.prop==true}
并让我的编译器告诉我是否有任何错误,不要进行评估。我想我真正想要的是重写。()运算符(筛选器运算符),但ActionScript不允许重写运算符:(唯一的问题是:AS3不支持运算符重载…因此…我不知道实际使用筛选器运算符的任何方法。)(事实上,存在这样一个错误,这意味着过滤器操作符是受支持的。没有时间去寻找,但我要求你调查一下……Adobe从来不会对任何事情进行大杂烩/局部作业。如果你看到错误,你也会看到匹配的功能。