まつもと ゆきひろです.

In message "[ruby-list:348] Re: modify syntax(Re: operator)"
    on 96/07/29, 石塚圭樹 <keiju / shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|> (3) break,next,redo,retry,failのメソッド化
|
|>     これらは単なるメソッドになります.予約語でありません.
|>     ですから,alias continue nextなどということもできるよう
|>     になります.
|
|使い方は以前と変わらないわけですよね?

変わりません.違いは

  * break,next,redo,retryに引数をつけてしまってもコンパイル
    時のチェックが行われない
  * failに2つ以上の引数を渡してもコンパイル時にチェックでき
    ない
  * break,next,redo,retryでのstatement not reachedチェックが
    行われなくなった(でも,こんなのあったなんて知らなかった
    でしょう?)
  * メソッドなのでaliasが指定できるようになった
  * 間違ってnextなんて名前のメソッドを定義してはまる可能性が
    出て来た

くらいでしょうか.

|> (4) Array#sortが配列をソートするのではなく,ソートした配列
|>     を返すようにした.元の動作をするメソッドsort!もある.
|
|そうそう. 変だと思ってリクエストしようと思っていました. これ以外のメソッ
|ドで,  xxx が xxx! という意味になるものは存在しないのでしょうか?

実はrubyにおけるxxx!メソッドの定義はいまいち曖昧でした.
schemeのように破壊的な関数にかならずついているというわけでも
ないですし.

# 破壊的っていうのはオブジェクト(または環境)の状態を変化させ
# てしまうってことです.

で,曖昧なルールを明確化しようと考えたところ,rubyでは同じよ
うな働きをするメソッドを二つ提供した場合,破壊的な(あるいは
より危険な)メソッドのに`!'をつけるというルールにしようと思い
ました.

例えば,

  String#chopとString#chop!(破壊的かどうか)
  exitとexit!(危険かどうか)

などです.0.99.1でのnext!などはちょっと例外っぽいんですけど,
これもnextが再定義された場合はnext!の方が制御を中断したりし
てより危険だと解釈してください(ちょっと苦しい).

逆にいうと破壊的なメソッドしか提供されない場合はその操作が破
壊的であっても`!'はつきません(例: Array#push).

                                まつもと ゆきひろ /:|)