Каким самым чистым способом смоделировать pass-by-reference в ActionScript 3.0?

ActionScript 3.0 (и я предполагаю, что Javascript и ECMAScript вообще) не имеют сквозной ссылки для собственных типов, таких как int. В результате я нахожу получение значений обратно из функции, действительно неуклюжей. Какая нормальная модель работает вокруг этого?

Например, существует ли чистый способ реализовать swap (intA, intB) в ActionScript?

Ответ 1

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

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);

Ответ 2

Я полагаю, что альтернатива будет где-то определять такие вещи...

public class Reference {
    public var value:*;
}

Затем используйте функции, которые принимают некоторое количество опорных аргументов, чтобы действовать как "указатели", если вы действительно просто ищете "вне" параметры и либо инициализируете их по пути, либо нет, и ваш обмен будет:

function swap(Reference a, Reference b) {
    var tmp:* = a.value;
    a.value = b.value;
    b.value = tmp;
}

И вы всегда можете сходить с ума и определить конкретные IntReference, StringReference и т.д.

Ответ 3

Это nitpicking, но int, String, Number, а остальные передаются по ссылке, просто они неизменяемы. Конечно, эффект такой же, как если бы они были переданы по значению.

Ответ 4

Вы также можете использовать оболочку вместо int:

public class Integer
{
    public var value:int;

    public function Integer(value:int)
    {
        this.value = value;
    }
}

Конечно, это было бы более полезно, если бы вы могли использовать перегрузку оператора...

Ответ 5

Просто посмотрите на некоторый Java-код. У Java было соглашение о том, что ссылочные типы передаются по ссылке, а примитивные типы передаются по значению с момента его создания. Это очень хорошая модель во многих отношениях.

Но говоря о свопе, лучший и самый простой способ сделать своп в Java/AS3 имеет следующие три строки:

var temp:int = array[i];
array[j] = array[i];
array[i] = temp;

На самом деле нет никакой причины использовать функцию для простого обмена, когда вы можете сделать это быстрее всего за 3 строки.

Ответ 6

Это раздражает. Но если вы используете разные идиомы, чем, например, С#, вы можете получить результаты разумного качества. Если вам нужно передать много параметров взад и вперед, перейдите в объект, заполненный необходимыми данными, и измените параметры объекта при возврате. Класс Object предназначен именно для этого.

Если вам просто нужно вернуть кучу данных, верните объект. Это больше соответствует стилю ECMAScript, чем семантика pass-by-ref.

Ответ 7

Назначение деструктуризации (например, [a, b] = [b, a]) не определено в спецификации ECMA-262 3 и не реализовано в JavaScript 1.5, которое является версией, эквивалентной реализации JScript в IE, Я видел этот синтаксис в предварительном предварительном просмотре AS4, хотя, и я считаю его частью JavaScript 1.7.

Ответ 8

Если ActionScript работает как Javascript,

[a,b] = [b,a]