2011年12月1日木曜日

[ruby]includeとextend

Rubyにおけるincludeとextendの違いは言葉で言われてもピンと来ないので実際に試した方が早いのね。
irbで試しましょう。

とりあえずこんなモジュールを用意します。
module A
 def hello
  "hello"
 end
end

そして使ってみます。まずはinclude。
class B
 include A
end

test = B.new
test.hello => #"hello"
B.hello => #"NoMethodError"

次にextend。
class C
 extend A
end

C.hello => #"hello"
test = C.new
test.hello => #"NoMethodError"
test.extend(A)
test.hello => #"hello"
つまりincludeはインスタンスメソッドを差し込むのに対して、extendは特異メソッドを挿入するかたちになります。
だからクラス定義の中でextendすると、クラスの特異メソッド=クラスメソッドになります。

0 件のコメント:

コメントを投稿