Какой самый чистый способ имитировать передачу по ссылке в Actionscript 3.0? - PullRequest
13 голосов
/ 08 сентября 2008

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

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

Ответы [ 8 ]

7 голосов
/ 09 сентября 2008

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

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);
4 голосов
/ 09 сентября 2008

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

4 голосов
/ 09 сентября 2008

Полагаю, альтернатива была бы где-то, определяющим подобные вещи ...

public class Reference {
    public var value:*;
}

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

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

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

3 голосов
/ 09 сентября 2008

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

public class Integer
{
    public var value:int;

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

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

2 голосов
/ 12 марта 2010

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

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

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

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

1 голос
/ 18 марта 2009

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

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

0 голосов
/ 21 августа 2009

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

0 голосов
/ 08 сентября 2008

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

[a,b] = [b,a]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...