Actionscript 3.0(我假设一般使用Javascript和ECMAScript)缺少像int这样的本机类型的传递引用。因此,我发现从一个非常笨重的函数中获取值。解决这个问题的正常模式是什么?什么是最简单的方法来模拟Actionscript 3.0中的传递引用?
例如,是否有一个干净的方式来实现swap(intA,intB)在Actionscript?
Actionscript 3.0(我假设一般使用Javascript和ECMAScript)缺少像int这样的本机类型的传递引用。因此,我发现从一个非常笨重的函数中获取值。解决这个问题的正常模式是什么?什么是最简单的方法来模拟Actionscript 3.0中的传递引用?
例如,是否有一个干净的方式来实现swap(intA,intB)在Actionscript?
我相信你能做到的最好的是传递一个容器对象作为参数传递给函数,改变该对象的一些属性值:
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:*;
}
然后使用带有一定数量的引用参数的函数来充当“指针”,如果您确实只是查找“out”参数并将其初始化,并且您的交换将变为:
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类仅用于这类事情。
如果你只是需要返回一堆数据,返回一个Object。这比ECMAScript风格更符合pass-by-ref语义。
ECMA-262 3规范中没有定义解构赋值(例如[a,b] = [b,a]),它没有在JavaScript 1.5中实现,该版本等同于JScript实现的版本IE浏览器。我已经在AS4规范预览中看到了这个语法,我相信它是JavaScript 1.7的一部分。
只看一些Java代码。 Java有一个惯例,即引用类型是通过引用传递的,而基本类型是从值开始传递的。这在很多方面都是非常好的模式。
可是谈到交换,做在的Java/AS3交换的最好和最简单的方法是使用下面三行:
var temp:int = array[i]; array[j] = array[i]; array[i] = temp;
即使世界没有真正任何理由使用的功能做一个简单的交换,只要3条线就可以更快速地完成。
hasseg中不起作用,我支持希望有人知道更优雅的技巧,但看起来您的答案似乎是最好的。我认为自然的后续行动是:这个限制是否会让其他人疯狂,还是仅仅是我? :) – 2008-09-08 23:48:44