That's a great response, thank you On Sun, Apr 12, 2009 at 10:14 PM, Juan Pablo Califano <califa010.flashcod...@gmail.com> 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 <alexander.far...@gmail.com> > >> 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); >> } >>
_______________________________________________ Flashcoders mailing list Flashcoders@chattyfig.figleaf.com http://chattyfig.figleaf.com/mailman/listinfo/flashcoders