Какой самый простой способ имитировать передачу по ссылке в Actionscript 3.0?

StackOverflow https://stackoverflow.com/questions/49107

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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 и т. д.

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

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

public class Integer
{
    public var value:int;

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

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

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

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

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

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

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

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

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

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

[a,b] = [b,a]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top