2008-10-16 3 views
5

C'est un peu compliqué de chercher 'var: *' car la plupart des moteurs de recherche ne le trouveront pas.Que signifie exactement var x: * dans actionscript?

Je ne comprends pas exactement ce que var: * signifie, par rapport à dire var: Object

Je pensais que ce serait me laisser définir les propriétés arbitraires sur un objet comme:

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

mais cela donne moi une erreur:

Property nonExistantProperty not found on x 

Que signifie * exactement?

Édition: J'ai corrigé l'original var: * dans le bon var x: *. Perdu ma connexion Internet

Répondre

1

C'est le type "non typé". Cela signifie simplement que la variable peut être de n'importe quel type. Fondamentalement, le même effet que celle-ci:

var x = myObject; 
1

Cela signifie que le type est spécifié et peut être utilisé avec tout type. Cependant, vous ne pouvez pas définir de propriétés aléatoires sur celui-ci. Il se comportera comme n'importe quel type que vous le définissez. La syntaxe exacte est:

var x:*; 
2

Il est un moyen de spécifier une variable non typée afin que vous puissiez essentiellement affecter tout type à lui. Le code

var x:* = oneTypeObject; 

crée la variable x assigne la variable oneTypeObject à elle. Vous pouvez attribuer un type tout à fait différent à elle ainsi que suit:

var x:* = anotherTypeObject; 

Cependant, vous ne pouvez toujours pas arbitrairement définir ou propriétés accès; ils doivent exister dans le type sous-jacent (soit oneTypeObject ou anotherTypeObject).

Les deux types peuvent avoir des propriétés nommées de façon identique, ce qui signifie que vous pouvez accéder à ou définir cette propriété dans x sans avoir à vous soucier du type sous-jacent.

12

En développant les autres réponses, déclarer quelque chose avec l'astérisque de type est exactement la même chose que de le laisser non typé.

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

Cependant, la question de savoir si vous êtes autorisé à affecter des propriétés non Existant à des objets n'a rien à voir avec le type de la référence, et est déterminé par le fait que l'objet ou non est une instance d'une dynamique classe.

Par exemple, étant donné que l'objet est dynamique et chaîne n'est pas:

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 

Notez que vous pouvez toujours attribuer de nouvelles propriétés à l'objet, peu importe le type de référence que vous utilisez. De même, vous ne pouvez jamais assigner de nouvelles propriétés à la chaîne, mais si vous utilisez une référence typée, le compilateur la récupère et avec une référence non typée, le compilateur ne sait pas si b est dynamique ou non, donc l'erreur se produit lors de l'exécution.

Soit dit en passant, la référence doc sur type astérisque se trouve ici:

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

(. Le moteur de balisage refuse de Linkify que, en raison de l'astérisque)

0

Comme ils l'ont déjà dit, il n'est pas typé, il peut donc contenir n'importe quel type de données. Cependant, vous ne pouvez pas le traiter comme tel dans les opérations. Par exemple, ce code est valide:

var untyped:* = functionThatReturnsSomeValue(); 

Mais si vous allez un peu plus loin, vous devez faire attention ou vous pourriez faire piquer:

var name:String = untyped.name; 

Maintenant, si l'objet est retourné par cette fonction arrive à être un objet avec un champ avec un identifiant de "nom", vous êtes en clair. Cependant, à moins de savoir avec certitude que c'est le cas, il est préférable d'utiliser des objets typés. De cette façon, le compilateur vous alertera si vous faites quelque chose qui pourrait lancer une erreur lors de l'exécution:

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

(and the code at hand) 
var typed:TypedObject = functionThatReturnsTypedObject(); 
var name:String = typed.name;