Замена ActionScript 3.0

Можно ли реализовать процедуру подкачки в ActionScript 3.0, аналогичную C++ std::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

Это не работает "как есть" для целых чисел, потому что они передаются по значению, а не по ссылке в процедуру Swap.


person Nick    schedule 31.03.2011    source источник


Ответы (3)


К сожалению, вы не можете реализовать замену таким образом, потому что ActionScript 3, Java и многие другие языки передавать примитивы и ссылки на объекты по значению. Эта ссылка даст вам подробную информацию, но в основном это означает, что ссылки внутри функции не совпадают со ссылками вне функции (даже если они действительно ссылаются на один и тот же объект). Таким образом, возня со ссылками на параметры в функции не имеет никакого эффекта вне функции. Вы вынуждены сделать встроенный обмен.

Если вам действительно нужно какое-то поведение подкачки в функции, вам придется обернуть параметры в другой объект, а затем вы можете изменить внутреннюю ссылку:

public static function Swap(var a, var b)
{
    var c = a.value;
    a.value = b.value;
    b.value = c;
}
person Mike Welsh    schedule 31.03.2011

К сожалению, 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);
}

Я знаю... Это некрасиво и не подходит в большинстве случаев...

¹ На самом деле это неверно, так как ссылки разные, но указывают на один и тот же объект, в отличие от примитивов, ссылки указывают на разные примитивные значения.

person NemoStein    schedule 31.03.2011