isInitializedビルトイン関数


isInitializedビルトイン関数は、その引数として参照する変数を持ち、もしそれが既に設定されていたらtrueを返します。 明確な設定と見なされるときだけに注意してください。 もし変数がその型のデフォルト値で始まっていたら、 これは設定とはみなされません。 典型的な使い方は、initブロックで、初期化されていないインスタンス変数を設定することです。

class Temperature {
   var fahrenheit : Number;
   var celcius : Number;
   function show() { println( "Fahrenheit: {fahrenheit},  Celcius: {celcius}" ) }
   init {
      if (not isInitialized(fahrenheit)) {
         fahrenheit = celcius * 9 / 5 + 32
      } else {
         celcius = (fahrenheit - 32) * 5 / 9
      }
   }
}
Temperature{fahrenheit: 98.6}.show();
Temperature{celcius: 100}.show();

印字結果:

Fahrenheit: 98.6,  Celcius: 37.0
Fahrenheit: 212.0,  Celcius: 100.0

もし設定が発生するたびに更新するなら、on replace句の中で isInitialisedを使います。

class Temperature {
   var fahrenheit : Number on replace {
      if (isInitialized(fahrenheit)) {
         celcius = (fahrenheit - 32) * 5 / 9
      }
   }
   var celcius : Number on replace {
      if (isInitialized(celcius)) {
         fahrenheit = celcius * 9 / 5 + 32
      }
   }
   function show() { println( "Fahrenheit: {fahrenheit},  Celcius: {celcius}" ) }
}

isInitializedは、インスタンス変数がデフォルト値に初期設定されたら、変更を止めることに注意してください。


Home