JavaFX Tips
こんなクラスを作ってみた
class RangedString { attribute src: String; attribute b: int; attribute e: int; attribute toString:String; } attribute RangedString.toString = bind src.substring(b,e); var r=RangedString {src: "aiue" b:1 e:4};
なぜかStringIndexOutofBoundsがでる.
そこで,こんなデバッグ
import java.lang.*; class RangedString { attribute src: String; attribute b: int; attribute e: int; attribute toString:String; } operation debug(msg) { System.out.println("DEBUG {msg}"); return msg; } attribute RangedString.toString = bind debug("{src}.substring({b},{e})"); var r=RangedString {src: "aiue" b:1 e:4};
結果は:
DEBUG .substring(0,0) DEBUG aiue.substring(0,0) DEBUG aiue.substring(1,0) !ここ! DEBUG aiue.substring(1,4)
つまり,インスタンス変数の中身がかわるたびにtoString が評価されている(toString を使っていなくても)
この場合 bind より bind lazy のほうがよさそうだ