【发布时间】:2010-09-08 03:00:54
【问题描述】:
Actionscript 3.0(我一般假设是 Javascript 和 ECMAScript)缺少对 int 等原生类型的传递引用。结果,我发现从函数中取回值真的很笨重。解决这个问题的正常模式是什么?
例如,有没有一种干净的方法可以在 Actionscript 中实现 swap( intA, intB )?
【问题讨论】:
标签: actionscript-3
Actionscript 3.0(我一般假设是 Javascript 和 ECMAScript)缺少对 int 等原生类型的传递引用。结果,我发现从函数中取回值真的很笨重。解决这个问题的正常模式是什么?
例如,有没有一种干净的方法可以在 Actionscript 中实现 swap( intA, intB )?
【问题讨论】:
标签: actionscript-3
我相信您能做的最好的事情就是将容器对象作为参数传递给函数并更改该对象中某些属性的值:
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、String、Number 和其他的是通过引用传递的,只是它们是不可变的。当然,效果和传值一样。
【讨论】:
您也可以使用包装器代替 int:
public class Integer
{
public var value:int;
public function Integer(value:int)
{
this.value = value;
}
}
当然,如果您可以使用运算符重载,这将更有用...
【讨论】:
看看一些 Java 代码。 Java 从一开始就有一个约定,即引用类型通过引用传递,原始类型通过值传递。从很多方面来看,它都是一个非常好的模型。
但是谈到交换,在 Java/AS3 中进行交换的最好和最简单的方法是使用以下三行:
var temp:int = array[i]; 数组[j] = 数组[i]; 数组[i] = 温度;实际上没有任何理由使用函数进行简单的交换,因为您只需 3 行就可以更快地完成。
【讨论】:
这很烦人。但是如果你使用不同的习语而不是例如C#,您可以获得合理质量的结果。如果需要来回传递很多参数,传入一个填充了所需数据的对象,返回时更改对象的参数。 Object 类就是为了这类事情。
如果只需要返回一堆数据,返回一个Object。这更符合 ECMAScript 风格,而不是 pass-by-ref 语义。
【讨论】:
解构赋值(例如 [a,b] = [b,a])没有在 ECMA-262 3 规范中定义,也没有在 JavaScript 1.5 中实现,该版本相当于 IE 中的 JScript 实现.我在 AS4 规范预览中看到过这种语法,我相信它是 JavaScript 1.7 的一部分。
【讨论】:
如果 ActionScript 像 Javascript 一样工作,
[a,b] = [b,a]
【讨论】: