2008-09-08 100 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條線就可以更快速地完成。

相關問題