Передача переменных ByRef в ActionScript 3

Можно ли передать параметр методу ByRef (или out и т. д.) в ActionScript 3?

У меня есть некоторые глобальные переменные в верхней части моего класса, и мой метод заполнит эту переменную, если она == null.

Я передаю переменную, которая должна быть заполнена, но до сих пор мои усилия возвращали локально заполненную переменную, оставляя ее глобальную версию по-прежнему нулевой.

Переменная, передаваемая моему методу, различается, поэтому я не могу жестко запрограммировать ее в своем методе и просто установить ее.


person Jamie Dixon    schedule 26.08.2009    source источник


Ответы (4)


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

Но, чтобы ответить на ваш вопрос. Вот решение:

function populateIfNull(variableName, value){
    this[variableName] = this[variableName] || value
}

Который вы можете использовать как:

populateIfNull('name', 'Bob')
populateIfNull('age', 20)
person airportyh    schedule 26.08.2009

В AS3 нет передачи по ссылке (в этом отношении она похожа на Java, поскольку передает ссылки по значению).

Нечто подобное можно смоделировать, если вы управляете клиентским кодом, оборачивая объект в другой объект:

var myObj = null;
myFun({ a: myObj });
function (param) {
  if (param.a == null) {
    param.a = "Hello";
  }
}
person jsight    schedule 26.08.2009

Используйте объекты.

eg:

var myObj : Object = new Object();
var myArr : Array;

myObj.arr = myArr;

function populateViaRef(obj : Object) : void {
    obj.arr = new Array();

  for(var i : Number = 0; i < 10; i++)
     obj.arr[i] = i;

}

populateViaRef(myObj);

for(var i : Number = 0; i < 10; i++)
    trace(myObj.arr[i]);
person Razvan    schedule 20.08.2010

В ActionScript 3.0 все аргументы передаются по ссылке, поскольку все значения хранятся как объекты. Однако объекты, принадлежащие к примитивным типам данных, включая Boolean, Number, int, uint и String, имеют специальные операторы, которые заставляют их вести себя так, как если бы они были переданы по значению. http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

В Java аргументы передаются по значению. http://javadude.com/articles/passbyvalue.htm

person akhil_mittal    schedule 30.04.2013
comment
Старый ответ. Но неправильно. Значения не хранятся как объекты и не передаются как ссылки. Вы можете создать объект global.uint, но он не будет примитивом uint. - person Klaider; 15.10.2017
comment
Объект является примитивным типом, но он хранится как указатель. - person Klaider; 15.10.2017