ごとけんです

In message "[ruby-list:13952] Re: destructive methods (Re:  Re: What is Object in Ruby?)"
    on 99/04/20, Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> 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