坂野 正明と申します。

At Sat, 9 Feb 2002 03:10:37 +0900,
Tanaka Akira wrote:
> もし、プログラマの期待をうまく認識することができるなら、その期待に従っ
> て動けばいい、というのが Ruby の選んだやりかただと理解しています。つま
> り、プログラマの期待通りに動くのでプログラマは驚かない、ということを目
> 指しているわけで、

ひとつ皆様のご意見をお聞かせ願えれば、ということがあります。

Ruby の def 文においては、引数の受渡しは、多重代入と大体同じ
(違いは引数の数のミスマッチに関する厳しさだけ?)だと思います。ですので、
def文の中で、破壊的メソッドを使う時は要注意なんだと認識しています。

例えば、以下のスクリプト。

#------------
class String
  def abcdef(s)
    s << "abc"
    s+="def"
  end
end

a=""
b="xyz".abcdef(a)
p a		# "abc"
p b		# "abcdef"
#------------

b は"予想通り"ですが、ここで、a が変化するのは、嬉しくないことも
あるかと思います。個人的には、(Ruby歴は短いのですが) def文の中の
実行文で、(self と Global変数以外の)外部の変数に影響を与えたいと
思ったことはありません。

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

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

さかのまさあき