From: Urabe Shyouhei Date: 2008-10-23T02:07:32+09:00 Subject: [ruby-dev:36871] Re: [Bug #650] Marshal.load raises RegexpError 卜部です。 ちょと混乱してきました。石塚さんがおっしゃっておられる「例外」ってのはな んなんでしょう。 私の中ではRubyのException(つまりrb_raise()でトリガするあれ)のつもりだっ たので、例外を発生させたところで処理が中断する前提でお話をしていたのです が、「変換に失敗したものだけが例外になってもらった方が」のくだりで指して おられる「例外」は、どうもそれとは違うようで。 石塚圭樹 さんは書きました: >> いや、まず例外が起きるなら現状と何ら変わりませんがな。 >> > > パラメータを指定するなら, 例外の捕捉を書いてもあまり変わらないと思いま > す. > > >> 失敗したやつはともかくとして、それ以外の部分データを救いたいのが動機 >> です。 >> > > そうすると, 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 <<--- >