4. class methodを協x
# class methodを弖紗したい
class SampleClass 盾hポイント
def self.puts_str(str="hello")
puts str ?クラスメソッドとはクラスで慌
end
end 嗤のメソッド。
SampleClass.puts_str
5. 馨庄恰-庄稼でがんばる
~% 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 盾hポイント
end
end ?ぎゃ
class SampleClass
include SampleModule ?これでできないのか`。。。
end
?できそうなんだけどなぁ。。
SampleClass.puts_str
?Yとしては、moduleメソッ
ドはSampleModule.puts_strみ
たいにしか聞えない。
6. mix-inをもうちょっと
# なんとかmix-inでクラスメソッド
を弖紗したい 盾hポイント
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つは肝で盾h
include SampleModule
end
SampleClass.puts_str
7. includedとextend
included(class_or_module) extend(module)
self が include されたときに鵑離ラスまた 哈方で峺協したモジュ`ルのインスタンスメソッドを self の蒙
はモジュ`ルを哈方にインタプリタから柵び竃されま メソッドとして弖紗します。self を卦します。
す。
include は、クラス(のインスタンス)にC嬬を弖紗しますが、
module Foo extend は、ある蒙協のオブジェクトだけにモジュ`ルのC嬬を
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"
盾hポイント
?なんと、includedの哈方は柵び竃し圷そ
のもの
?extendは哈方のモジュ`ルを蒙メソッ
ドとして弖紗
8. mix-inでできた
# なんとかmix-inでクラスメソッド
を弖紗したい 盾hポイント
module SampleModule ?includedされたタイミングで柵
def self.included(base)
base.extend(ClassMethods) び竃し圷にClassMedhodsを蒙
end
module ClassMethods メソッドとして弖紗
def puts_str(str="hello")
puts str
?參貧のY惚により、蒙メソッ
end ドがクラスメソッドのように尅
end
end る玲う
class SampleClass
include SampleModule
end
SampleClass.puts_str
9. Sな圭隈 orz
module ClassMethods 盾hポイント
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. 庄稼界鉛顎糸艶するとどうなる
盾hポイント
module ClassMethods ?蒙メソッドにする弖紗はできるけ
def puts_str(str="hello") ど、畠悶にする弖紗はできない。
puts str
end ?privateなんだとさ。
end
class SampleClass ?Yとして、extendで蒙メソッドの
end
弖紗はできるが、includeでクラスメ
SampleClass.include ClassMethods ソッドの弖紗をするrは垢健が駅勣に
SampleClass.puts_str
なる。
?こんなところにYくなってか。
~% ruby ruby-expert2-5.rb
ruby-expert2-5.rb:11: private ?extendもmix-inの匯つだよな。。。
method `include' called for includeしかmix-inと柵ばないなんてこ
SampleClass:Class (NoMethodError)
とはないよな。。。