From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2008-10-22T22:56:44+09:00 Subject: [ruby-dev:36870] Re: [Bug #650] Marshal.load raises RegexpError けいじゅ@いしつかです. In [ruby-dev :36865 ] the message: "[ruby-dev:36865] Re: [Bug #650] Marshal.load raises RegexpError ", on Oct/22 20:31(JST) Urabe Shyouhei writes: >卜部です。 >いや、まず例外が起きるなら現状と何ら変わりませんがな。 パラメータを指定するなら, 例外の捕捉を書いてもあまり変わらないと思いま す. >失敗したやつはともかくとして、それ以外の部分データを救いたいのが動機 >です。 そうすると, 1.8で作成したデータを1.9で使えるようにコンバートしたいって 用途だと考えてよいでしょうか? 文字列と違って, 相手はオブジェクトなので, 再生を失敗したオブジェクトも それなりのものに再変換する必要があると思います. また, 例えば, PStoreに入っているオブジェクト群を変換することを考えると, ほとんどのものは正常に再生できることが多いと思いますので, 変換に失敗し たものだけが例外になってもらった方がコンバートもしやすいです. あと, 気になっているのが, [1, 2, 3, <再生不能オブジェクト>] が dump されていたとして, これをloadすると 何が帰ってくるのでしょう? 私は, まず例外を発生させて, [1, 2, 4, markerオブジェクト] になるのかな? と考えていました. 例外を捕捉してから, オブジェクト内をス キャンしていくイメージです. 卜部さんの案はどのように返ってくるのでしょ う? ただ, スキャンするといっても, 任意のオブジェクトのツリーのスキャンを一 般のユーザにやってもらうのは難しい気がしてきました. で, こんなのはいか がでしょう? obj = Marshal.load(src, invalid: proc{|invalid_info| ...}) 再生不能オブジェクトに当たったら, 指定したprocを呼び出し, それなりのオ ブジェクトを返してもらって, それをloadの返り値にアサインするというもの です. これだったら, 複雑なネットワーク状になったオブジェクト群をloadし た場合でも, それなりに対応できそうです. >例外のほうがうれしい局面ってあるんでしょうかね。 converter的な使い方をするのであれば, 例外である必要はない気がします. >invalid: :replaceはもちろんString#encodeから引っ張ってきたアイディアです >けど、 そうだったんですか... bladeで調べたんですけど, 探し方が悪いのか本質的な議論は見つかりません でした. 他で議論されたものです? __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---