JavaFXのbind 続編

skrbさんから,with inverseを使うと双方向のバインドができると教えていただいた.試してみたら確かに動く.変数cをletでなくて,varで定義している点に注意.

var a = 1;
let b = bind a * 2 ;
var c = bind a with inverse;

System.out.println("hello {a}, {b}, {c}");
a = 2;
System.out.println("hello {a}, {b}, {c}");
c = 10;
System.out.println("hello {a}, {b}, {c}");

実行すると,こうなる.

hello 1, 2, 1
hello 2, 4, 2
hello 10, 20, 10

すごいぜ! cに代入しただけなのに,a に値が行って,bの値までちゃんと更新されている.

どこまでできる?

しかしこれって,どのくらい強力なんだろう?bindの右辺には任意の式が書け,関数さえ書けるのだが,そのinverseは計算可能なのか?

ためしてみる.簡単なかけ算.これなら逆関数を計算するのは簡単なはず.

var a = 1;
let b = bind a * 2 ;
var c = bind (a * 2) with inverse;

結果.

operator * cannot be applied to 
com.sun.javafx.runtime.location.IntVariable,int
var c = bind (a * 2) with inverse;
1 error
BUILD FAILED (total time: 1 second)

やっぱりだめだ.いくら簡単でもやりだすときりがないので,with inverseがつくときには,多分変数しかbindできないんだろう.

ところで

この書き方,言語仕様のドラフトには乗っていない(たぶん).0.7から1.0になるときに,ずいぶん言語仕様を整理したらしいので,まだ完全版になっていないということか.

いずれにしろskrbさんありがとうございました.