在ActionScript 3.0中模拟传递引用的最干净方法是什么?
Actionscript 3.0(我通常假定Javascript和ECMAScript)缺少对诸如int之类的本机类型的按引用传递。结果,我发现从一个函数中获取值确实很笨拙。解决此问题的正常模式是什么?
例如,是否有一种干净的方法在Actionscript中实现swap(intA,intB)?
解决方案
回答
如果ActionScript的工作方式类似于Javascript,
[a,b] = [b,a]
回答
我相信我们能做的最好的就是将容器对象作为参数传递给函数,并更改该对象中某些属性的值:
function swapAB(aValuesContainer:Object):void { if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b"))) throw new ArgumentError("aValuesContainer must have properties a and b"); var tempValue:int = aValuesContainer["a"]; aValuesContainer["a"] = aValuesContainer["b"]; aValuesContainer["b"] = tempValue; } var ints:Object = {a:13, b:25}; swapAB(ints);
回答
我想一个替代方案可能是在定义这种事情的地方...
public class Reference { public var value:*; }
然后,如果我们确实只是在寻找"输出"参数,然后在传入或者传出过程中对其进行初始化,则交换使用以下函数:
function swap(Reference a, Reference b) { var tmp:* = a.value; a.value = b.value; b.value = tmp; }
而且,我们总是可以发疯并定义特定的IntReference,StringReference等。
回答
我们也可以使用包装器而不是int:
public class Integer { public var value:int; public function Integer(value:int) { this.value = value; } }
当然,如果可以使用运算符重载,这将更加有用...
回答
这是挑剔的,但是int,String,Number和其他参数是通过引用传递的,只是它们是不可变的。当然,效果与按值传递一样。
回答
真烦人但是如果我们使用的习惯用法与例如C#,可以获得合理质量的结果。如果需要来回传递大量参数,则传递一个装有所需数据的对象,并在返回时更改该对象的参数。 Object类仅用于这种事情。
如果只需要返回一堆数据,则返回一个对象。与传递引用语义相比,这更符合ECMAScript样式。
回答
ECMA-262 3规范未定义解构分配(例如[a,b] = [b,a]),并且未在JavaScript 1.5中实现,JavaScript 1.5与IE中的JScript实现等效。不过,我已经在AS4规范预览中看到了这种语法,并且我相信它是JavaScript 1.7的一部分。
回答
只需看一些Java代码即可。 Java的约定是,自创建以来,引用类型按引用传递,原始类型按值传递。从许多方面来看,这是一个非常好的模型。
但是,关于交换,在Java / AS3中进行交换的最佳和最简单的方法是以下三行:
var temp:int = array[i]; array[j] = array[i]; array[i] = temp;
当我们仅用3行就可以更快地完成交换时,实际上没有任何理由使用函数进行简单交换。