まつもと ゆきひろです.

In message "[ruby-list:2143] Re: [BUG] for line in $<"
    on 97/02/16, 石塚圭樹 <keiju / shljapan.co.jp> writes:
|けいじゅ@SHLジャパンです. 

|>|[2] cloneの定義
|>特異クラスを継承しているというのはむずかしい表現ですね.
|>cloneは特異メソッドも含めて継承していると表現してください.
|>rubyの実行モデルには「特異クラス」というものはありません.こ
|>れは実装上の都合です.

まだ表現が悪いですね.

  「cloneは特異メソッドも含めて複製している」

に読み替えてください.

|どうも実装上の話しがこびり付いてしまっていて... 以後気をつけます. 
|# このMLを読んでいる他の人にも良くない影響がありますしね.

ということで「特異クラス」という表現は忘れてください.> みなさん

|そうすると, dupとcloneは違うメソッドなの? 

ちがいます.デフォルトのdupは

  def dup
    self.clone
  end

ですけど.例えば,String#dupは「同じ内容の文字列」を返します.
一方,String#cloneはfreezeも含めて「同じ状態の文字列」を返し
ます.

|># 特異メソッドに関してはSelf(言語)のモデルを想像してください.
|># 実装にとらわれて特異クラスのことを考えると混乱します.
|
|なるほど. その通りですね. 
|
|# Selfといって分かる人はあまりいないとおもいますが...

Selfってのはクラスがなくて特異メソッドしかない言語です.

|ということは, これって, 結構重要なことを言っているような気がします.
|
|同じ振舞いをするオブジェクトかどうかを比較する必要はないようにプログラ
|ムを組まなくてはならないことを意味しますよね?

まあ,しかしSelfと違って特異メソッドはrubyではそれほど重要な
位置を占めませんから,ほとんどの場合クラスでdispatchして大丈
夫だと思います.

# typeが返すのはクラス名なのに気をつけてください.

                                まつもと ゆきひろ /:|)
p.s.
Module#===の定義を変更して

  case obj
  when Class, Module
   ...
  end

なんてのを書けると便利かな.