Actionscript 3.0 swap - PullRequest
       2

Actionscript 3.0 swap

3 голосов
/ 31 марта 2011

Возможно ли реализовать процедуру подкачки в 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.

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

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

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

public static function Swap(var a, var b)
{
    var c = a.value;
    a.value = b.value;
    b.value = c;
}
2 голосов
/ 31 марта 2011

Если вы можете постобработать свой SWF , вы можете использовать Apparat tools для создания Macro: http://code.google.com/p/apparat/wiki/MacroExpansion

, он даже уже существует метод подкачкив BitMacro:

http://www.google.com/codesearch/p?hl=en#3GyOvBpuCbk/apparat-ersatz/src/main/as3/apparat/math/BitMacro.as&q=swap%20package:http://apparat%5C.googlecode%5C.com&sa=N&cd=3&ct=rc

2 голосов
/ 31 марта 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);
}

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

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

...