コンパイラ版とインタプリタ版の違い その 2
前回の違いはそれなりに知られていることですが、今回は結構知られてないんじゃないかなぁ。
複数要素変数の定義
複数要素変数というのは、いうなれば配列です。ただ、JavaFX Script では複数要素変数でも、単一要素を代入することもできるので、配列というのとはちょっと違います。でも、書くのが面倒くさいので、以後は配列と書きます。
インタプリター版の時、配列は次のように定義します。
var array1:Integer* = [1, 2, 3]; // 要素数が 0 以上 var array2:Integer+ = [1, 2, 3]; // 要素数が 1 以上
普通は * を使うことが多いですね。
で、現状の コンパイラ版のスペック を読むと...
* や + を使うと記述してあるところと、[] を使うと記述してあるところがあります。
attribute のところでは
Multi-valued attributes (i.e. those declared with the * or + cardinality specifiers) are represented as arrays.
variable の sequence のところでは
Sequence types are declared with the [] annotation:
と記述されています。
ところが実際に試してみると [] しか使えないことが分かります。
var array:Integer[] = [1, 2, 3];
なんだかなぁ ^^;;
型名省略の廃止
インタープリター版では型が推定できるところは省略できたところがあるのですが、コンパイラ版では型省略ができなくなってしまいました。
たとえば、インタープリター版では次のようなコードが書けました。
Rect { transform: rotate(20, 0, 0) fill: blue x: 50, y: 30 width: 100, height: 50 }
このコードは青い四角形を 20 度回転させるというコードです。
transform アトリビュートの型は Transform クラスなので、Transform クラスの派生クラスである Rotate クラスの rotate メソッドを直接記述できます。
fill アトリビュートの型は Color クラスなので、Color クラスの定数 blue を直接記述できます。
これに対し、コンパイラ版では次のように記述します。
Rect { transform: Transform.rotate(20, 0, 0) fill: Color.BLUE x: 50, y: 30 width: 100, height: 50 }
赤字で示しているように、メソッドや定数の前にクラスを記述しています。つまり、型の省略ができなくなってしまったわけです。
この点に関しては、インタープリター版の記述方法の方がさくらばは好きですね。
今日はここまで。