Передать переменные как ссылку AS3 - PullRequest
1 голос
/ 02 мая 2020

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

пример (psuedocode):

function random(a:number, b:number, c:number):void{
a = RNG(20);
b = RNG(25);
c = RNG(30);
}

там будут две разные переменные, передаваемые через a, b и c, это глобальные переменные, а a, b и c - нет. Цель состоит в том, чтобы не иметь одинаковых строк кода для обоих отдельных наборов переменных для установки номеров ГСЧ.

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

У меня есть два набора глобальных переменных, которые я хочу передать в эту функцию и установить их равными одному и тому же диапазону ГСЧ как соответствующие в каждом наборе. То, как я пытаюсь это сделать, не повторяя «a = RNG (20);» дважды для каждого - путем передачи глобальных переменных в функцию в качестве аргументов, но аргументы - это переменные, для которых установлен RNG. Единственный способ, которым это может работать, - это если переменные передаются в функцию в качестве ссылки, так что установка RNG для аргументов изменит глобальные переменные.

1 Ответ

3 голосов
/ 02 мая 2020

В AS3 есть два типа данных:

  1. Обычные данные: Логическое , Строка , Число , int , uint - всегда передаются как значения.
  2. Объекты: Объект , Массив и буквально все остальное - всегда передаются как указатель / ссылка, а не через copy / clone.

Нет хитрости, как в C / C ++, - передать некоторую простую переменную в качестве указателя, чтобы позволить методу изменить исходное и единственное значение .

Тем не менее, существует два пути.

Решение №1 : вы можете передавать переменные косвенно, в парах, таких как контейнер → имя переменной.

function doIt(A:Object, a:String):void
{
    A[a] = RNG(20);
}

Решение №2 : разработать пользовательский класс-оболочку для пересечения границы между обычными и объектными данными.

Реализация:

package
{
    public class Oint
    {
        public var data:int;

        // Class constructor.
        public function Oint(value:int = 0)
        {
            data = value;
        }

        // There's always nice to have a interface methods,
        // rather than member or getter/setter, because
        // you can actually link to read/write methods.
        public function read():int
        {
            return data;
        }

        public function write(value:int):void
        {
            data = value;
        }

        // With this you can use Oint variables in math expressions.
        public function valueOf():Object
        {
            return data;
        }

        // With this you can trace Oint variables and see their values.
        public function toString():String
        {
            return data.toString();
        }
    }
}

Использование:

function random(a:Oint, b:Oint, c:Oint):void
{
    a.data = RNG(20);
    b.data = RNG(25);
    c.data = RNG(30);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...