Можете ли вы использовать аргументы “ByRef” в функциях AS3?

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

  •  22-07-2019
  •  | 
  •  

Вопрос

Есть какие-нибудь идеи, как это сделать возвращает несколько переменных из функции в 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"}
Это было полезно?

Решение

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

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

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

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

  

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

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

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

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

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old
<Ч>

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

Все зависит от значения, если вы разбираетесь в программировании на C, вы будете знакомы с концепцией указателей.

Думайте о указателе как указывающем на что-то в памяти, и все имена переменных "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 всегда будут указывать на "null" и "новый спрайт в памяти" соответственно, если только они не изменены как s1 и s2 в пределах их "Области видимости" <- Пожалуйста, убедитесь, что вы понимаете область видимости переменной, прежде чем даже пытаться решить эту проблему.

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

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

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

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

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]

Обратите внимание на небольшую разницу между примером 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

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

scroll top