Actionscript 3 ActionScript中的E4X
看看ActionScript中的E4X实现,我突然想到,他们必须找出如何在ActionScript中定期完成三件事,我不确定: 前缀为@: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开
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从来不会对任何事情进行大杂烩/局部作业。如果你看到错误,你也会看到匹配的功能。