At Tue, 12 Feb 2002 19:14:03 +0900,
Masaaki Sakano wrote:
> 
> b は"予想通り"ですが、ここで、a が変化するのは、嬉しくないこともある
> かと思います。個人的には、(Ruby歴は短いのですが) def文の中の実行文で、
> (self と Global変数以外の)外部の変数に影響を与えたいと思ったことはあ
> りません。

場合によっては"引き数を更新して、結果(処理の成否)を戻り値にする"ことを
考えますが、稀ですね。複数の値を返したい時には配列やハッシュを使うこと
が多いし。

C言語などの"変数"と違って、"値への参照"という点でひっかかることはあり
そうな気がします。引き数が式なら、式の結果(無名オブジェクト?)をメソッ
ド内で変更することになるので、呼び出し側へ影響しませんよね。

> 私が思いついたところでは、def の中の最初で、.cloneするか(美しくない?
> )、すぐ .freeze しておいて、誤って破壊的メソッドを使った時にエラーが
> 出るようにするか(複雑な分岐があれば見過ごす可能性あり)、とかですが。

".clone!"がないので代入式になっちゃうのが美しくないかも。".freeze"だと、
呼び出し側で引き数に与えた変数(オブジェクト)にも波及するので、あとで困
りませんか? # freezeの解除はできませんよね?

> 何か、lint のようなことで検出できれば、言うことないかな、と思います。
> # しかし何が破壊的メソッドかの完全な判別は原理的に不可能に近い?
> いかがでしょうか?

defの際に、引き数の名前に"in_"とか"out_"を付けたことはあります。が、あ
くまでも目印になるだけですね。

lintのような別のツールで良ければ、rubyunitで検査するというのは有効だと
思います。例のような場合なら、テストケースでひっかかりますから。

# rubyunitやwebunitって、とっても良いですよ。助かっております。(-_-)

///// ------------------------------------------------------------------
-O-O-    斉藤 秀格 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido)
  _      master / shukaku.nu          (ぱふ)   http://www.pugh.palm-j.com/
                                             (旧URL: "http://i.am/PUGH")