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 のほうがよさそうだ