Можете ли вы иметь аргументы "ByRef" в функциях AS3? - PullRequest
5 голосов
/ 03 декабря 2008

Есть идеи, как вернуть несколько переменных из функции в ActionScript 3?

Что-нибудь вроде VB.NET, где вы можете изменить переменную входного аргумента (аргументы ByRef)?

Sub do (ByRef inout As Integer)
 inout *= 5;
End Sub

Dim num As Integer = 10
Debug.WriteLine (num)        '10
do (num)
Debug.WriteLine (num)        '50

Все, что угодно , кроме , возвращающего ассоциативный массив ?

return {a:"string 1", b:"string 2"}

Ответы [ 6 ]

15 голосов
/ 03 декабря 2008

Цитирование источника в гугле:

В ActionScript 3.0 все аргументы передаются по ссылке, поскольку все значения хранятся в виде объектов. Однако объекты, принадлежащие к примитивным типам данных, в том числе Boolean, Number, int, uint и String, имеют специальные операторы, которые заставляют их вести себя так, как если бы они были переданы по значению.

Что привело меня к поиску канонического источника .

6 голосов
/ 03 декабря 2008

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

function func(a:String){
    a="newVal";
}

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old

Итак ... String тоже входит в черный список данных? Булево тоже? Я имею в виду как точно сказать , какие типы передаются по ссылке?

3 голосов
/ 03 декабря 2008

Все в AS3 является ссылкой, кроме [u] целых. В общем, все, что наследует Object, будет передано функции ссылкой.

При этом, как я полагаю, единственный способ сделать это - использовать класс-контейнер, такой как Array или String ("5" и выполнить преобразование + математика).

2 голосов
/ 13 июля 2010

Это все по значению, если вы понимаете программирование на С, вы будете знакомы с концепцией указателей.

Представьте, что указатель указывает на что-то в памяти, а все имена переменных "bob from (bob = new person ();)" по сути являются указателями, с которыми вы работаете.

Теперь, когда вы объявляете функцию, так как все они по значению

function Test(a:Object, b:Object):void {
   a = b;
}

Вы можете думать, что и "a", и "b" являются новыми указателями, поэтому только в функции "Test" существуют и "a", и "b", которые указывают на что-то в памяти.

Так что давайте использовать это

var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);

Таким образом, указатели s1 и s2 ВСЕГДА будут указывать на «ноль» и «новый спрайт в памяти» соответственно, если они не будут изменены как s1 и s2 в своей «области видимости» <- Пожалуйста, убедитесь, что вы понимаете переменную область видимости, прежде чем даже пытаясь справиться с этим. </p>

И теперь внутри функции у нас есть два новых указателя «a», указывающих на «null» и «b», указывающих на «тот же спрайт в памяти, что и s2». Так как объекты и массивы по сути являются коллекциями указателей, и только две новые указатели были созданы функцией для использования «a» и «b» любых свойств / переменных переменных «указатели на данные в памяти» из «a» или «b» все равно будет точно таким же, как и для "s1" и "s2", и будут точно такими же указателями.

Таким образом, внутри функции, когда для "a" установлено значение "b", на самом деле все, что происходит, - это то, что указатель "a" теперь указывает на то же самое, что и "b". Но «s1» и «s2» по-прежнему указывают на то, на что они указывали раньше.

!!!! Если бы это было по ссылке, вы не могли бы думать о «a» и «b» как о новых указателях, они фактически были бы самими «s1» и «s2», за исключением того, что вы записали их как «a» и «b» .

2 голосов
/ 26 марта 2009

Wrong Wrong Wrong и Wrong .. каждый аргумент передается по значению !!! тот факт, что вы можете изменить свойство внутри переданного объекта, не означает, что вы можете изменить сам объект. попробуйте следующий код

function Test(a:Object, b:Object):void {
   a = b;
}

function Test2():void {
   var s1:Sprite = null;
   var s2:Sprite = new Sprite;

   Test(s1,s2);
   Trace(s1);
   Trace(s2);
}

и вот результат трассировки:

null
[object Sprite]
0 голосов
/ 07 октября 2009

Обратите внимание на тонкую разницу между примером DarthZorG и этим из документов Flash:

function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    trace(objParam.x, objParam.y); 
} 
var objVar:Object = {x:10, y:15}; 
trace(objVar.x, objVar.y); // 10 15 
passByRef(objVar); // 11 16 
trace(objVar.x, objVar.y); // 11 16

Точка Бытия: Вы не можете изменить то, на что указывает ссылка, но вы можете изменить данные, на которые указывает ссылка, если эта ссылка является Объектом / Массивом.

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