シーケンスの展開

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] のようにロジックもなく、宣言的に書けるのです。

ね、便利でしょ。