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さんありがとうございました.