2011-03-31 94 views
3

是否有可能在ActionScript 3.0中實現交換例程,類似於C++ std :: swap? 我的意思是這樣Actionscript 3.0 swap

public static function Swap(var a, var b):void 
    { 
     var c = a; 
     a = b; 
     b = c; 
    } 

然後

var a:int = 3; 
    var b:int = 5; 
    Swap(a,b); 
    trace(a, " ", b); // there must be 5 3 

它不工作,「如」爲整數,因爲他們是按值傳遞,而不是REF到交換程序。

回答

4

不幸的是,您不能以這種方式實現交換,因爲ActionScript 3,Java和其他許多語言pass primitives and object references by value。該鏈接會給你細節,但基本上這意味着函數內的引用與函數外部的引用不同(即使它們確實引用同一對象)。因此,在函數外部擺弄函數中的參數引用不起作用。你被迫做內聯交換。

如果你真的需要在函數一些交換行爲,你必須包裝在另一個對象的參數,然後你可以改變內部參考:

public static function Swap(var a, var b) 
{ 
    var c = a.value; 
    a.value = b.value; 
    b.value = c; 
} 
2

不幸的是,Actionscript總是通過值傳遞原語,並總是通過引用¹(有人糾正我,如果我錯了)傳遞對象

你可以做的是將你的原語包裝到一個對象中。

var A:Object = {"value":3}; 
var B:Object = {"value":5}; 

Swap(A, B); 

trace(A.value, B.value); 

function Swap(a:Object, b:Object):void 
{ 
    var temp:Object = a.value; 

    a.value = int(b.value); 
    b.value = int(temp); 
} 

我知道......這是醜陋和不適合在大多數的情況下...

¹事實上,這是不正確的,因爲引用是不同的,但點與基元相反,同一個對象指向不同的基元值。