在ActionScript 3.0中模拟传递引用的最干净方法是什么?

时间:2020-03-05 18:49:08  来源:igfitidea点击:

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行就可以更快地完成交换时,实际上没有任何理由使用函数进行简单交换。