2008-09-08 37 views

回答

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

hasseg中不起作用,我支持希望有人知道更优雅的技巧,但看起来您的答案似乎是最好的。我认为自然的后续行动是:这个限制是否会让其他人疯狂,还是仅仅是我? :) – 2008-09-08 23:48:44

-2

如果动作脚本作品如Javascript,

[a,b] = [b,a] 
+0

对不起,但这在ActionScript – Turambar 2008-09-08 16:03:08

4

我想替代将是某处定义这样的事情......

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等

3

你也可以使用一个包装,而不是为int:

public class Integer 
{ 
    public var value:int; 

    public function Integer(value:int) 
    { 
     this.value = value; 
    } 
} 

当然,这将是更有益的,如果你能使用操作符重载...

4

这是吹毛求疵,但intStringNumber和其他按引用传递,这只是他们是不可改变的。当然,效果与通过价值传递一样。

1

这很烦人。但是,如果你使用不同的习语而不是例如C#,你可以得到合理质量的结果。如果您需要传入大量参数,请传入填充所需数据的对象,并在返回时更改对象的参数。 Object类仅用于这类事情。

如果你只是需要返回一堆数据,返回一个Object。这比ECMAScript风格更符合pass-by-ref语义。

0

ECMA-262 3规范中没有定义解构赋值(例如[a,b] = [b,a]),它没有在JavaScript 1.5中实现,该版本等同于JScript实现的版本IE浏览器。我已经在AS4规范预览中看到了这个语法,我相信它是JavaScript 1.7的一部分。

2

只看一些Java代码。 Java有一个惯例,即引用类型是通过引用传递的,而基本类型是从值开始传递的。这在很多方面都是非常好的模式。

可是谈到交换,做在的Java/AS3交换的最好和最简单的方法是使用下面三行:

 
var temp:int = array[i]; 
array[j] = array[i]; 
array[i] = temp; 

即使世界没有真正任何理由使用的功能做一个简单的交换,只要3条线就可以更快速地完成。

相关问题