JavaFX Script では配列はシーケンスといいます。正確には両者は違う概念なんだけど、まぁだいたい同じと考えても大丈夫。
シーケンスは 1 次元しかありません。多次元はないんです。
シーケンスの中にシーケンスを書くと、展開されて 1 次元になります。
だから、
var x = [1, 2, 3, 4]; var y = [[1, 2], [3, 4]];
の x と y は同じものを表しています。
このシーケンスの展開について id:hidemon さんが http://d.hatena.ne.jp/hidemon/20081028/1225173087 で、「これって便利か?」かと疑問を呈しています。
でも、これは結構便利ですよ。
上のコードのように、直接数値などを代入していると、便利そうには見えないんですが、変数やアトリビュートを並べると、便利さが分かります。
たとえば、イメージ検索をする例を考えます。フレームの上部にパネルがあってテキストフィールドとボタンが配置されているとしましょう。
そして、フレームの下部は検索結果のイメージのサムネイルが表示されると。
イメージは検索結果によってその都度変化するので、これだけを変数としておきます。
で、JavaFX で書くとプログラムはこんな感じになります。あくまでも「もどき」ですよ。
var panel = ComponentView {
component: FlowPanel {
content: [
TextField {
columns: 10, text: ""
editable: true
},
Button {
text: "Search"
action: function() {
// ここで検索
var image: ImageView;
insert image into images;
}
}
]
}
};
var images: ImageView[] = [];
Frame {
title: "Search"
width: 800, height: 400
closeAction: function() {
java.lang.System.exit( 0 );
}
visible: true
stage: Stage {
content: [
panel, images
]
}
}
注目して欲しいのは最後の方の Stage オブジェクトの content アトリビュートです。
content アトリビュートには panel と images が入っています。でも、images もシーケンスです。
もし、シーケンスが展開されないのであれば、content に images の内容を追加するために for 文で回して追加するというようなロジックが必要になります。
でも、勝手に展開されてしまうので、[panel, images] のようにロジックもなく、宣言的に書けるのです。
ね、便利でしょ。