まつもと ゆきひろです

In message "[ruby-list:9978] include vs extend"
    on 98/10/11, TEI meiki <tei / harmony.co.jp> writes:

|鄭です。

|lib/tk.rb を眺めていると、
|
|	module TkCore
|	  include TkComm
|	  extend TkComm
|
|といった記述があります。
|リファレンスマニュアルで、include と extend をみてもいまひとつ理解できません。
|include は、
|
|  module Hoge
|    あれこれ
|  end
|  class Hare
|   include Hoge  #  ここに 「あれこれ」 を書いたのと同じ事
|   なんとかかんとか
|  end
|
|と理解していたのですが、あってますでしょうか?

ほぼ合ってます.「ほぼ」というのは,includeはここにあれこれ
書いたのとはちょっと違うからです.

  * includeしたモジュールの定数は Hare::Const で参照できない
  * includeしたメソッドと同じ名前のメソッドを定義するとsuper
    で呼び出せる

点が違います.

|extend は、
|
|  module Hoge
|    あれこれ
|  end
|  class Hare
|   extend Hoge  #  ここに 「あれこれ」の中のメソッド定義だけ
|                # 抜きだして書いたのと同じ。
|   なんとかかんとか
|  end
|
|という解釈で、あってますでしょうか?

違います.extendはそのオブジェクト(の特異クラス)にincludeし
ます.つまり

  module Hoge
  class Hare
    class <<Hare
      include Hoge
    end
  end

と同じです.意味としては「そのモジュールのメソッドをクラスメ
ソッドとして追加する」です.

|上の理解だと、、
|
|	module TkCore
|	  include TkComm
|	  extend TkComm
|
|と同じモジュールを include してextend する意義がわからないのです。

「include TkComm」でTkCommのメソッドをTkCoreのメソッドとして
追加し,「include TkComm」でTkCommのメソッドをTkCoreのモジュー
ルメソッドとして追加してます.

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