4. class methodを定義
# class methodを追加したい
class SampleClass 解説ポイント
def self.puts_str(str="hello")
puts str •クラスメソッドとはクラスで共
end
end 有のメソッド。
SampleClass.puts_str
5. mix-inでがんばる
~% ruby ruby-expert2-2.rb
ruby-expert2-2.rb:12: undefined method
# mix-inでクラスメソッドを追加し `puts_str' for SampleClass:Class
たい (NoMethodError)
module SampleModule
def self.puts_str(str="hello")
puts str 解説ポイント
end
end •ぎゃ!
class SampleClass
include SampleModule •これでできないのかー。。。
end
•できそうなんだけどなぁ。。
SampleClass.puts_str
•結論としては、moduleメソッ
ドはSampleModule.puts_strみ
たいにしか使えない。
6. mix-inをもうちょっと
# なんとかmix-inでクラスメソッド
を追加したい 解説ポイント
module SampleModule
•なんだこれ?
def self.included(base) •クラスメソッドを書きたいだけ
base.extend(ClassMethods)
end なのに、なげーよ。
module ClassMethods
def puts_str(str="hello") •でも、思いついた人はエラい!
puts str •includedってなんだ?
end
end •extendってなんだ?
end
class SampleClass •上の2つは次で解説
include SampleModule
end
SampleClass.puts_str
7. includedとextend
included(class_or_module) extend(module)
self が include されたときに対象のクラスまた 引数で指定したモジュールのインスタンスメソッドを self の特
はモジュールを引数にインタプリタから呼び出されま 異メソッドとして追加します。self を返します。
す。
include は、クラス(のインスタンス)に機能を追加しますが、
module Foo extend は、ある特定のオブジェクトだけにモジュールの機能を
def self.included(mod) 追加したいときに使用します。
p "#{mod} include #{self}"
end module Foo
end def a
class Bar 'ok'
include Foo end
end end
# => "Bar include Foo"
obj = Object.new
obj.extend Foo
p obj.a #=> "ok"
解説ポイント
•なんと、includedの引数は呼び出し元そ
のもの
•extendは引数のモジュールを特異メソッ
ドとして追加
8. mix-inでできた
# なんとかmix-inでクラスメソッド
を追加したい 解説ポイント
module SampleModule •includedされたタイミングで呼
def self.included(base)
base.extend(ClassMethods) び出し元にClassMedhodsを特
end
module ClassMethods 異メソッドとして追加
def puts_str(str="hello")
puts str
•以上の結果により、特異メソッ
end ドがクラスメソッドのように振
end
end る舞う
class SampleClass
include SampleModule
end
SampleClass.puts_str
9. 楽な方法 orz
module ClassMethods 解説ポイント
def puts_str(str="hello") •なんだ、クラスメソッドとしてextend
puts str
end するだけでよかったのか。
end
class SampleClass •これでincludeをクラスメソッドとして
end
やってみるとどうなる?
SampleClass.extend ClassMethods
SampleClass.puts_str
~% ruby ruby-expert2-4.rb
hello
10. includeするとどうなる
解説ポイント
module ClassMethods •特異メソッドに対する追加はできるけ
def puts_str(str="hello") ど、全体に対する追加はできない。
puts str
end •privateなんだとさ。
end
class SampleClass •結論として、extendで特異メソッドの
end
追加はできるが、includeでクラスメ
SampleClass.include ClassMethods ソッドの追加をする時は工夫が必要に
SampleClass.puts_str
なる。
•こんなところに結論書くなってか。
~% ruby ruby-expert2-5.rb
ruby-expert2-5.rb:11: private •extendもmix-inの一つだよな。。。
method `include' called for includeしかmix-inと呼ばないなんてこ
SampleClass:Class (NoMethodError)
とはないよな。。。