2011年1月21日

[ruby-list:47769] Re: Hashイテレーション中の新規キー追加

畠山です。

まつもとさん、郡司さん、お返事ありがとうございます。

> ある「構造を持ったデータ」に対して、「構造をループで解釈しながら
> 何かをする」と言う発想ではなく、「構造の外側から操作する」
> という発想です。

もちろん、自己のループ内で自己の構造を変化させると自己言及的(いわゆるメタプログラミング)になり、将来の挙動が予測困難になる可能性があるので、確実に動作を保証したい場合はそういった実装はできるだけ避ける方が良い、と私も思っています。ただ、文法としてそれが許されるか許されないかで、表現の自由度が制限されてくると思うだけです。
(ちょっと横道にそれますが Ruby はこういう自己言及の問題を考える上でとても有効なツールであると個人的には思っています。Ruby
は動的な処理が他の言語に比べて優れている(と思う)ので、ある便利なソフトウェアを開発できるだけではなく、科学的な哲学的な知的好奇心の思考実験の道具としてもつかえると思っているのですが、文法表現の自由度が下がると(思考)実験できる幅も狭まってしまいます。つまり、思考実験の道具としての価値も下がってしまいます。この動的な処理をうまく活用できると
Rails のように優れたツールが生まれますし、逆に黒魔術と言われるようにコードの可読性保守性が低下する場合もあると思います。)

話を元に戻します。
つまりは、もともと Ruby 1.8 でもブロックイテレーション中のハッシュ書き換え操作 (Hash#merge,
Hash#rehashなど) は意図されて許可されていたものではなく、それがいままで正しく? (プログラマの意図したように)
動いていた場合というのはたまたま偶然であって、また、Hash
実装上の理由ですべての場合で動作するように変更するのは難しい、ということで、Ruby 1.9.2 で修正した
(意図的に禁止した)、という解釈でよろしいのでしょうか。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/23617
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/23626

つまり、Ruby 1.9.2 以降も禁止されて続ける (だろう) と解釈してよいでしょうか。
個人的には、Hash (Array) ブロックイテレーション中の動的なデータ変化、挙動変化は Ruby らしいと感動しいていた者なので残念ですが。


畠山

投稿者 xml-rpc : 2011年1月21日 17:29
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101446
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。