ブロックの終了とともに消えるというルールが成立する。一見するとそんなに変なルールではない。(closureのためのローカル変数が必要で導入した)時には、結構いいアイディアだと思っていた。ところが問題はRubyの特徴である宣言がないところにある。あるローカル変数の有効範囲がどこまでなのかがひとめでわからない。ブロックが始まる前に初期化されているかどうかは、スコープの先頭までさかのぼって見ないといけない。変数名が重なっちゃったりすると思わぬ挙動を引き起こすことになる。「変数のスコープがひとめでわからない」というのはRuby的には面白くない。機会があれば直そうとずっと考えていたのだ。直す方法はいろいろ考えられたが、長らく考えて結局これがベストと思えるものは以下の通り。class/module/defで導入される(対応するendまで)。これらはネストしない。最初に設計した時点では宣言を避けることにこだわり過ぎていたようだ。今回はブロックパラメータを宣言として利用しようということ。この際ブロックパラメータと同じ名前のローカル変数がすでにあった場合にはどうするべきかという課題がある。「重複は悪である、許すべきでない」派がいる。世の中には前者も多いようだ。どちらにも嬉しくない両者痛み分けの対応を考えている。以前のアイディアの中には「:=」で代入した変数はブロックローカルブロックパラメータの後ろに「;」で区切ってブロックローカル変数名を羅列などもあったが、前者は簡潔な記法ではあるが「宣言」としては目立たなすぎるので不採用。後者もそんなに多用することはないだろうということになった。...}というようなローカル変数導入用メソッドを用意すればよいだろう。...}のような書き方を許すようになるかもしれない。外側で参照されたブロックに所属するというものだ。}end結構面白いし、今でもうまく運用できそうな気もしている。「説明するのが面倒なルールは良くないルール」の原則によりボツになったのだった。ツッコミをいただいてます*1。これは一種の時差ぼけです(本当か?)。そのうち追いつくと思います。