From: gotoken@... (GOTO Kentaro) Date: 1999-04-21T05:24:30+09:00 Subject: [ruby-list:13963] Re: destructive methods (Re: Re: What is Object in Ruby?) ごとけんです In message "[ruby-list:13952] Re: destructive methods (Re: Re: What is Object in Ruby?)" on 99/04/20, Shin-ichiro Hara writes: >|# instance_eval の挙動が違うといったら怒る?? >その手のものは全て etc... で undef していると思って下さい。(^^; なる。んじゃ非破壊的です。呼出側で決して違いを知ることが できなければ破壊的とは考えません。 >|ちなみに id の変化にまつわることだけクリアすれば「絶対非 >|破壊的メソッド」を設計する技法は開発可能だと思ってます。 > >なんですかそれ? > >class Object > def identity; self; end > def ignore(*x); nil; end >end > >なんてのとは違うんですよね。 それも具体例ではあります。ある書き方が「破壊的かも」とい うことは有限的に特徴づけられると思うのでそれを避けること で「絶対に破壊的でない」メソッドを書く方法ができるだろう ということを想像しています。データの伝搬を taint として 追跡することの遠い親戚として、メソッド間の依存関係から 「破壊的かも」を静的に特徴づけるようなイメージ。一方、 Ruby で書かれたあるメソッドが「破壊的」であるか否かとい う決定問題は実装を見て個別に判断せざるを得ないと思います。 >|>「この操作は破壊的ですか?」「何の意味で破壊的か聞いてるの?」 >|>質問に質問で答えるという手です。 >| >|でわ質問:「IO#gets は ==-破壊的ですか??」 > >素朴に答えると、IO#== は Object#== をそのまま使っているの >で id だけで判断されるから「==-破壊的」でない。それが気に >入らないなら自分で == を定義し直して下さい、って所かしら。 なるほど。しかしこれも実行不可能な概念なのですね。実行後 のオブジェクトと実行前のオブジェクトは比べられないから。 ところで、マニュアルによれば .dup.== と .== は同値にみえ ますが、 % ruby-1.3 -e 'a = $stdin; b = a.dup; p a == b' false となります。仕様なのかなぁ。 -- gotoken