Actionscript 3.0(我假设Javascript和ECMAScript一般)缺少像int这样的本机类型的传递引用。结果我发现从功能中获取的值非常笨重。解决这个问题的正常模式是什么?
例如,在Actionscript中有没有一种干净的方法来实现 swap(intA,intB)?
答案 0 :(得分:7)
我相信你能做的最好的事情就是将容器对象作为参数传递给函数并更改该对象中某些属性的值:
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);
答案 1 :(得分:4)
我认为另一种选择可以定义这种事情......
public class Reference {
public var value:*;
}
然后使用带有一些Reference参数的函数作为“指针”,如果你真的只是寻找“out”参数并且在中途或不在那里初始化它们并且你的交换会变成:
function swap(Reference a, Reference b) {
var tmp:* = a.value;
a.value = b.value;
b.value = tmp;
}
你总是可以坚持并定义特定的IntReference,StringReference等。
答案 2 :(得分:4)
这是挑剔,但int
,String
,Number
和其他 通过引用传递,只是它们是不可变的。当然,效果与通过值传递的效果相同。
答案 3 :(得分:3)
您也可以使用包装器而不是int:
public class Integer
{
public var value:int;
public function Integer(value:int)
{
this.value = value;
}
}
当然,如果您可以使用运算符重载,这将更有用......
答案 4 :(得分:2)
看看一些Java代码。 Java有这样的约定:引用类型是通过引用传递的,而原始类型是通过值传递的,因为它是一开始的。它在很多方面都是一个非常好的模型。
但谈到swap,在Java / AS3中进行交换的最佳和最简单的方法是使用以下三行:
var temp:int = array[i]; array[j] = array[i]; array[i] = temp;
没有任何理由使用函数进行简单的交换,只需3行就可以更快地完成。
答案 5 :(得分:1)
这很烦人。但是,如果你使用不同的成语,例如C#,您可以获得合理的质量结果。如果需要来回传递大量参数,请传入一个填充了所需数据的对象,并在返回时更改对象的参数。 Object类就是出于这种情况。
如果您只需要返回一堆数据,请返回一个Object。这更符合ECMAScript样式而不是pass-by-ref语义。
答案 6 :(得分:0)
解构赋值(例如[a,b] = [b,a])未在ECMA-262 3规范中定义,并且它未在JavaScript 1.5中实现,这是与IE中的JScript实现等效的版本。我已经在AS4规范预览中看到了这种语法,我相信它是JavaScript 1.7的一部分。
答案 7 :(得分:-2)
如果ActionScript像Javascript一样工作,
[a,b] = [b,a]