Mixinとは?
ruby初心者ですが、rubyやってる人が「mixinおもしろいよ!使い方間違えると大変なことになるけどw」とか言ってるの聞いて気になったので調べてみた。
mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。
[参照] http://ja.wikipedia.org/wiki/Mixin
(Rubyでは当てはまらないとの指摘を受けたので取り消しておきます)
お、おう。
なんとなくは分かった気になるけど、どういう動作するんだろう???
ということでやってみる。
参考
Rubyのmoduleをmix-inする際のincludeとextendの違いをシンプルな例で理解する(ほぼそのまま実践させていただきました)
ソース
mixin するモジュール
# my_modlue.rb
# coding:utf-8
module MyModule
def self.my_class_method
puts 'my_class_method!'
end
def my_method
puts 'my_method'
end
end
include でMixin
ソース
# coding:utf-8
require './my_module'
class SampleInclude
include MyModule
MyModule.my_class_method
begin
MyModule.my_method
rescue Exception => e
puts e
end
end
sample = SampleInclude.new
begin
sample.my_class_method
rescue Exception => e
puts e
end
sample.my_method
結果
% ruby sample_include.rb
my_class_method!
undefined method 'my_method' for MyModule:Module
undefined method 'my_class_method' for #SampleInclude:0x007f1fca0d58b8
my_method
extend で Mixin
ソース
# coding:utf-8
require './my_module.rb'
class SampleExtend
extend MyModule
MyModule.my_class_method
begin
MyModule.my_method
rescue Exception => e
puts e
end
self.my_method
end
begin
SampleExtend.my_class_method
rescue Exception => e
puts e
end
SampleExtend.my_method
sample = SampleExtend.new
begin
sample.my_method
rescue Exception => e
puts e
end
begin
sample.my_class_method
rescue Exception => e
puts e
end
結果
% ruby sample_extend.rb
my_class_method!
undefined method 'my_method' for MyModule:Module
my_method
undefined method 'my_class_method' for SampleExtend:Class
my_method
undefined method 'my_method' for #SampleExtend:0x007f3809b62ba8
undefined method 'my_class_method' for #SampleExtend:0x007f3809b62ba8
まとめ???
当然といえば当然だが、includeとextendで使い方が変わる。
正確に理解したわけじゃない状態だけど、一旦まとめてみる。
include での使い方?
Moduleの方でself.my_class_method...
ってしてるからnewした後に使えないのかな?
Moduleから直接叩かないと動かない感じに見えます。
include で SampleIncludeクラスの中にメソッド展開してるけど、実際には Moduleに紐付いてるから外からは動かせないイメージ。。
my_method
はその逆なイメージ。。
extend での使い方?
継承だから Module に紐付いてるメソッドしか見えない感じなのかな?
だから紐付いてないmy_method
はどこからも見えてないイメージ。。
最後に
とりあえずなんとなく使うことはできるだろうけど、ちゃんと理解してないから効果的に使える自信がない。。。
いきなりmixinやろうとしたのもいけなかったかなぁ。。
いろいろやりながら覚えるしかなさそうですねw