концепция похожа на указатели в as3? - PullRequest
2 голосов
/ 24 января 2012

Есть ли в as3 понятие указателей или что-то подобное?

Я использовал концепцию

var mc1:MovieClip;
var mc2:MovieClip();
var mcCommon:MovieClip = new MovieClip();
mcCommon["myptr"] = mc1;
mcCommon["myptr"] = mc2;

Где бы я мог прочитать и узнать больше об этой концепции.Я хотел бы получить простые ответы, так как я не эксперт в as3.Я все еще учусь.

Ответы [ 3 ]

8 голосов
/ 24 января 2012

Я не кодировал язык, который определенно использует указатели в течение некоторого времени, и я не уверен, что это именно то, что вы спрашиваете, но вот попытка ответить на ваш вопрос:

В AS3 ссылка на переменную Objects всегда является указателем, за исключением базовых типов (Strings, Numbers, ints и Booleans), которые всегда являются только по значению.

Итак, для базовых типов вы получаете поведение «по значению»:

var a:String = "hello";
var b:String = a;  // b is a new String, a clone of a
b += " world";
trace(a);  // hello
trace(b);  // hello world

Изменение b не изменило переменную a. Или, возможно, можно сказать, что a и b были ссылками на одну и ту же строку после строки 2, но оператор + = создал новую строку и присвоил ее b. Если вы посмотрите документацию String , обратите внимание, что ни одна из функций-членов на самом деле не изменяет String на месте, все они возвращают новые строки.

Вы увидите то же поведение с вызовами функций с простыми параметрами без указателя:

function wont_modify(word:String):String
{
  word += " world";
  return word;
}
var a:String = "hello";
trace(wont_modify(a));  // hello world
trace(a); // hello

Однако для непростых типов доступ осуществляется по ссылке (что в других языках называется указателем):

var a:Array = [1, 2, 3];
var b:Array = a;  // b is now a reference to a
b.push(4);
trace(a);  // [1, 2, 3, 4]
trace(b);  // [1, 2, 3, 4]

Если вы хотите поведение, подобное указателю, для простого типа, такого как String, оно должно быть членом объекта, подобного указателю, для которого вы передаете ссылку:

function will_modify(obj:Object):void
{
  obj.a += " world";
}
var obj:Object = { a:"hello" }
will_modify(obj);
trace(obj.a);  // hello world

Строки и числа фактически расширяют Object, но все операторы и вызовы функций обрабатывают их по значению, а не по ссылке.

2 голосов
/ 24 января 2012

Если вы спрашиваете конкретно о коде, в первую очередь он должен выглядеть следующим образом:

var mc1:MovieClip;
var mc2:MovieClip;
var mcCommon:MovieClip = new MovieClip();
mcCommon["myptr"] = mc1;
mcCommon["myptr"] = mc2;

Хотя и mc1, и mc2 фактически равны нулю.

Синтаксис mcCommon ["myptr"] означает, что вы создаете свойство с именем "myptr" в MovieClip mcCommon. Поэтому вы можете позже получить содержимое этого свойства, используя mcCommon ["myptr"]. Последняя строка фактически перезаписывает содержимое свойства (если оно, конечно, не равно нулю). Вы можете сделать это, потому что класс MovieClip является динамическим. В других (не динамических) экземплярах вы не можете создавать подобные свойства.

1 голос
/ 24 января 2012

Хотя это не то же самое, я думаю, что вы ищете Словарь , где каждое свойство в коллекции имеет String в качестве ключа, через который к нему можно получить доступ.

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