2011-03-31 110 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); 
} 

我知道......这是丑陋和不适合在大多数的情况下...

¹事实上,这是不正确的,因为引用是不同的,但点与基元相反,同一个对象指向不同的基元值。