看看E4X在ActionScript中的实现,我突然意识到,他们必须想出如何做我不确定能在ActionScript中定期完成的三件事情:
属性/Getters前缀为@: var myAttribute = xmlPerson.@name;
用于过滤的无名称函数: xmlData.person.(/* predicate */)
谓词的lambda语法: xmlData.person.(@name == "Brian")
因此,我的问题是:这些仅仅是一次性的功能(很像Vector.<>),它们只是为E4X而投入,从而使我们望而却步?或者,作为ActionScript开发人员,我们是否可以访问这些特性?
更具体地说,我希望自己的代码能够访问lambda谓词的表达式树(而不是以任何方式绑定到XML类)。
我想这叫“过滤器操作员”..。但我不知道如何利用它。不确定我能不能..。因为ActionScript不允许操作符重载:(
发布于 2010-12-22 17:44:05
据我所知,不可能为其他类型的对象利用E4X语法。这真的很可悲,因为它有很大的潜力,尤其是lamdba语法。
发布于 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看不到@字符,而筛选方法会导致运行时错误。你可以在下面看到它们:
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 {
}
}发布于 2011-01-06 20:37:20
我知道我迟到了,但是大脑,看来AS3支持过滤器操作符!
检查我得到的错误:
TypeError: Error #1123: Filter operator not supported on type XYZ在这一行代码中:
object.(getChildByName("image") as Sprite).addChild(img);好吧..。我想我们应该找出剩下的..。
https://stackoverflow.com/questions/4508509
复制相似问题