原です。

このスレッドはきっぱり「参照関係」を忘れるというスレッドかな。

In message "[ruby-list:13883] destructive methods (Re:  Re: What is Object in Ruby?)"
    on 99/04/19, Yukihiro Matsumoto <matz / netlab.co.jp> writes:

|In message "[ruby-list:13880] Re: What is Object in Ruby? (Re: Ruby and LISP)"
|    on 99/04/19, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:
|
||なるほどお。そういう立場もわかります。ちなみに破壊的とは
||何かに対する今の俺的解答はこう:それをやるのとやらないの
||ではその後のオブジェクトの振る舞いが違う。

そういう考えは好きです。

|この場合,そのオブジェクトの振る舞いは一切変わらないが,別の
|オブジェクトの振る舞いが変わってしまう(あるいは大域的な状態
|が変化する)ものは破壊的でしょうか?

そんじゃオブジェクトの振る舞いも一切変わらないし、他のオブ
ジェクトの状態にも影響がない場合はどうでしょう。

class Foo1
  def push(x); @var = x; end
  undef inspect; undef to_s # etc...
end
class Foo2 < Foo1; attr :var; end

foo1 = Foo1.new; foo1.push 0
foo2 = Foo2.new; foo2.push 0

このとき最初の push は非破壊的で次のは破壊的?

ついでに、

"abc".gsub!(/./, '\&') ってのは効果0の破壊的操作と呼ぶべきか
破壊的でない操作と呼ぶべきか?

またまた空論めいてきたけど、、、


新しいアイデアなんですが、破壊的かどうかというのは、言語レベル
の話ではないですよね。これは、破壊されたかどうか調べるメソッド
が定義できないという意味です。そこで破壊的かどうかの定義をユー
ザーまかせするのはどうでしょう。foo? をある一変数のメソッドと
して、

  a に対する操作の後を a' としたとき、a.foo?(a') が true と思
  えるなら「foo?-非破壊的」そうでないなら「foo?-破壊的」呼ぶ

  #実際に a.foo?(a') をスクリプトの上で実行できるわけではない。

例えば、

class Array1 < Array
  def foo?; true; end
end

とすると Array1 インスタンスに対する全ての操作は foo?-非破壊
的です。

ちなみのデフォルト(本質的なという意味はない)の「破壊的」は
「==-破壊的」の事。

「この操作は破壊的ですか?」「何の意味で破壊的か聞いてるの?」
質問に質問で答えるという手です。

これで何が解決されて何が解決されないのだろう?(^^;