まつもと ゆきひろです

In message "[ruby-list:16339] Re: ruby hacking guide"
    on 99/08/27, Minero Aoki <aamine / dp.u-netsurf.ne.jp> writes:

|ちょっと遅れましたが、Ruby Hacking Guide アップロードしました。
|まだ、すごく中途半端です。(いきなり本文が切れてたりする…)

細かいようですが、間違いを指摘しておきます。
気分を害さないで聞いといてくださいね。

-- object.html

  aliasとundef

  メソッドは、前節のようなつくりで登録され、動的に変更が可能で
  すから、 aliasやundefはかなり簡単に実装できそうです。aliasは、
  メソッドテーブルに 元の名前と同じ実体を新しいキーで登録すれ
  ばよく、undefは、キーを削除すれば いいだけです。

--

実際のaliasやundefはやや面倒です。意外ですか?

aliasは別名で呼んだメソッドの中でsuperが呼ばれたとき、あたか
も元の名前で呼ばれたかのようにスーパークラスの元の名前のメソッ
ドを呼び出す必要がある、という条件のために少々複雑なことをし
ています。

また、undefはメソッドを削除するのではなく、そのクラスにおい
てメソッドをキャンセルするものであるため、キーを削除すること
では実現できません。キーを削除するのは Module#remove_method
です。

-- object.html

  Stringの実体。Stringはよくコピーが作成されるので、文字列本体
  自体は最初からコピー せずに、変更が起こった時に始めてコピー
  するようになっています。

--

Rubyがcopy-on-writeしているのは確かなのですが、無条件に行っ
ているわけではありません。copy-on-writeの対象になるのは、プ
ログラム中に埋め込まれている文字列定数(リテラル)のみです。

-- object.html

  Regexpの実体。struct re_pattern_buffer *ptr が正規表現のパター
  ンで、 char *str がマッチ対象の文字列です。文字列を確保する
  のは、かっこや$1による、 マッチ後の参照に対応するためです。

--

マッチ後の参照のための文字列は RMatch 構造体に格納されます。
strの内容は正規表現のソースを保存し、デバッグや再生成に使う
ためです。

-- class.html

  ちなみに、Class.type が Class になるのはなぜかというと、type 
  がメタクラスを スキップするようになっているからです。ではス
  クリプトからメタクラスを見ることは できないのか??できませ
  ん。邪悪な方法(拡張モジュールをつくる)を除けばですが。

--

現在の実装で特異クラスを見る方法がひとつだけあります。

  class <<SomeClass
    self
  end

でselfが指しているものはSomeClassの特異クラス、つまりメタク
ラスです。もっとも将来にわたってそうであると約束しているわけ
ではないのですが。