シーケンスの展開
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] のようにロジックもなく、宣言的に書けるのです。
ね、便利でしょ。