Modulesの利点は2つ。
名前空間の提供
mixin機構
- Namespaces
module Trig
PI = 3.14
def Trig.sin(x)
...
end
が構文例。
Trig.sin
Trig::PI
とアクセス。
上の例は、クラスメソッドな書き方。
mixinするときは、インスタンスメソッドとして書く。
module Debug
def who_am_i?
...
end
class Phonograph
include Debug
...
end
なんぞ。このincludeはコピーではなく参照なり。
module側の関数からclassの中のmethodもcallできる。 - Iterators and the Enumerable Module
rubyのCollection classの機能を自前classにももたせたいとき、
継承ではなく、mixinという手もある。そのときはEnumeration module
をincludeする。 - Composing Modules
method callしたときに何が呼ばれるかは、動的スコープ、ということかな?
それがどのクラスで定義されているかとか、どのモジュールで定義されている
かは関係なく、実行時に参照されるものが実行される?- Instance Variables in Mixins
通常mixinするモジュールにはinstance変数をもたせない。
持つこともある。
持っている場合、mixinしたときに名前がぶつかると、混乱する。
idで、object id を参照できるので、状態を扱うにあたって、
instance variablesではなく、hashを使うという手もある。 - Resolving Ambiguous Method Names
effective method orderの話。
object -> mixin -> superclass ->superclass へのmixin -> ...
- Instance Variables in Mixins
- Including Other Files
loadとrequire。
requireは一回だけ。
loadとrequireする対象ファイルのtop level変数は、そのファイル
の中だけをスコープとする。
0 件のコメント:
コメントを投稿