Wednesday, March 14, 2007

Local Boolean variable initiation

Di actionscript 3.0, inisiasi primitive boolean bisa ditulis :



public var test:Boolean
//ini sama saja dengan yang dibawah:
public var test:Boolean = false;



Variable dengan type boolean bila tidak diinisiasi selalu bernilai false;
Tidak terlalu berbeda dengan java dan C++;
Cuma ada perbedaan dalam peletakan inisiasi local variable;
Di actionscript 3.0, local variable dapat terlihat di seluruh badan method / function.
Sedangkan java dan C++ memperbolehkan inisiasi block variable, jadi variable hanya terlihat dari dalam block saja pada suatu methods.
Misalnya inisiasi int pada loop yang terdapat dalam suatu function, bila dilihat dengan actionscript 3.0 memperbolehkan int tersebut dilihat dari tempat lain dalam function. Sedangkan java hanya memperbolehkan melihat int tersebut didalam blok saja.



Yang membuat ku kelabakan adalah penulisan semacam ini :



/**
* Code I
* @langversion Actionscript 3.0
*/

for(var i:int = 0 ; i<foo.length; i++){
   
var b:Boolean;
   
if(!b && foo[i].black){
       
//do something here
    }
else{
        b =
true;
    }
}



Loop diatas akan menghasilkan result yang tidak sesuai dengan harapan.
Cukup lama untuk mengetahui dimana salahnya (1 jam kali..) akhirnya ketahuan solusinya :



/**

* Code II

* @langversion Actionscript 3.0

*/


for(var i:int = 0 ; i<foo.length; i++){

   
//Baris koreksi disini
 var b:Boolean = false;



   
if(!b && foo[i].black){

       
//do something here

    }
else{


        b =
true;

    }

}



Akhirnya result sesuai harapan.



Kesimpulannya, apa sebab?
Pada code I , karena variable b yang sudah diinisiasi dengan perintah var b:Boolean,
harapan kita tentunya ingin b selalu otomatis jadi false.
Tapi ternyata..? deklarasi var b:Boolean tidak selalu jadi false bila ditaruh didalam perulangan!!
Karena pada iterasi (perulangan) berikutnya b sudah punya referensi yang bernilai true;



Repot juga.. ini mungkin karena declaration scope actionscript 3.0 yang berbeda dengan java kali ya?
Atau karena aku yang be**

No comments: