Many thanks for the in-depth reply, Juan. I learned something today. Zeh
On Sun, Apr 12, 2009 at 5:14 PM, Juan Pablo Califano < [email protected]> wrote: > The problem is that, while static initializer blocks look like their > counterparts in Java, they have a little but important difference. Even > though you use curly braces, you're not creating a new scope. In AS, scope > is either class / global or local (to a function or method). > > So, you cannot declare var i:int and access it statically, since by default > variables and methods are not static. An option is to make i static as you > did, but it looks ugly, since i is clearly a temporary variable. > > In C# you can declare a static constructor to handle such a situation (I'm > not 100% sure, but I think you can't use static initializers). This > constructor is automatically called when the class is loaded, or at least, > before the first instance is created. > > In Actionscript, you don't have this feature, but you can do something > similar, except you'd have to call your "static constructor" (or, more > properly, initializer method) manually. > > You could do something like this: > > > private static var BLACK:TextFormat = new TextFormat('Arial', 24, > 0x000000, true); > private static var RED:TextFormat = new TextFormat('Arial', 24, > 0xFF0000, true); > > // run static initializer method > { > staticInit(); > } > > private static function staticInit():void { > BLACK.letterSpacing = -4; > RED.letterSpacing = -4; > // i is now a local var and will go out of scope when this function > returns > for (var i:int = 0; i < 10; i++) > trace(i); > } > > In fact, there is a static constructor, but it's created ad hoc by the > compiler and called automatically by the runtime when the class is > initialized. If you decompile / disassemble your code, you'll see a method > called: > > static function YourClassName$cinit() > > This method contains all the inline static initializers. But since it's > generated by the compiler, you cannot declare it yourself. > > Nevertheless, making your own static initializer method and calling it > seems > a bit cleaner if you need some static initialization logic. > > > Cheers > Juan Pablo Califano > > > 2009/4/12 Alexander Farber <[email protected]> > > > Hello, > > > > I have a static initializer in my class and it works ok: > > > > private static var BLACK:TextFormat = new TextFormat('Arial', 24, > > 0x000000, true); > > private static var RED:TextFormat = new TextFormat('Arial', 24, > > 0xFF0000, true); > > // place "1" closer to "0" in the "10" string > > { > > BLACK.letterSpacing = -4; > > RED.letterSpacing = -4; > > } > > > > But when I try to add a for-loop there (I need to > > add some data to static array I have in the class), > > then I get errors "Access of undefined property i": > > > > { > > BLACK.letterSpacing = -4; > > RED.letterSpacing = -4; > > > > for (var i:uint = 0; i < 10; i++) > > trace(i); > > } > > > > I have to move the variable i outside the initializer: > > > > private static var i:uint; > > { > > BLACK.letterSpacing = -4; > > RED.letterSpacing = -4; > > > > for (i = 0; i < 10; i++) > > trace(i); > > } > > > > Isn't it strange? It looks ugly to me... > > > > Regards > > Alex > > _______________________________________________ > > Flashcoders mailing list > > [email protected] > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > _______________________________________________ > Flashcoders mailing list > [email protected] > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > _______________________________________________ Flashcoders mailing list [email protected] http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

