Что именно означает var x: * в actionscript? - PullRequest
5 голосов
/ 16 октября 2008

Искать 'var: *' немного сложно, потому что большинство поисковых систем его не найдут.

Мне не совсем понятно, что означает var: * по сравнению с var: Object

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

var x:*  = myObject;
x.nonExistantProperty = "123";

но это дает мне ошибку:

Property nonExistantProperty not found on x

Что * точно означает?

Редактировать: Я исправил исходную переменную: * к правильной переменной x: *. Потерял мое интернет-соединение

Ответы [ 5 ]

12 голосов
/ 17 октября 2008

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

var x:* = {};
var y = {}; // equivalent

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

Например, поскольку Object является динамическим, а String не является:

var o:Object = {};
o.foo = 1; // fine
var a:* = o;
a.bar = 1; // again, fine

var s:String = "";
s.foo = 1; // compile-time error
var b:* = s;
b.bar = 1; // run-time error

Обратите внимание, как вы всегда можете назначить новые свойства объекту, независимо от того, какую ссылку вы используете. Аналогично, вы никогда не можете назначать новые свойства для String, но если вы используете типизированную ссылку, то она будет перехвачена компилятором, и с нетипизированной ссылкой компилятор не будет знать, является ли b динамическим или нет, поэтому ошибка возникает во время выполнения.

Кстати, ссылку на документ по типу-звездочке можно найти здесь:

http://livedocs.adobe.com/labs/air/1/aslr/specialTypes.html#*

(механизм разметки отказывается связывать это из-за звездочки.)

2 голосов
/ 16 октября 2008

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

var x:* = oneTypeObject;

создает переменную x, затем присваивает ей переменную oneTypeObject. Вы можете назначить ему совершенно другой тип, а также:

var x:* = anotherTypeObject;

Однако вы все еще не можете произвольно устанавливать или получать доступ к свойствам; они должны существовать в базовом типе (либо oneTypeObject, либо anotherTypeObject).

Оба типа могут иметь свойства с одинаковыми именами, что означает, что вы можете получить доступ или установить это свойство в x, не заботясь о базовом типе.

1 голос
/ 16 октября 2008

Это означает, что тип не указан и может использоваться с любым типом. Тем не менее, вы не можете установить случайные свойства для него. Он будет вести себя как тип, который вы установили. Точный синтаксис:

var x:*;
1 голос
/ 16 октября 2008

Это «нетипизированный» тип. Это просто означает, что переменная может быть любого типа. В основном тот же эффект, что и при использовании:

var x = myObject;
0 голосов
/ 15 февраля 2013

Как они уже говорили, он не типизирован, поэтому может содержать любые данные. Тем не менее, вы не можете рассматривать его как таковой в операциях. Например, это действительный код:

var untyped:* = functionThatReturnsSomeValue();

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

var name:String = untyped.name;

Теперь, если объект, возвращаемый этой функцией, оказывается объектом с полем с идентификатором «name», вы находитесь в открытом виде. Однако, если вы точно не знаете, что это так, лучше использовать типизированные объекты. Таким образом, компилятор предупредит вас, если вы сделаете что-то, что может вызвать ошибку во время выполнения:

(elsewhere)
public class TypedObject()
{
    public var name:String = "";
}

(and the code at hand)
var typed:TypedObject = functionThatReturnsTypedObject();
var name:String = typed.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...