35
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mixinってなんなのさ

Last updated at Posted at 2015-05-01

Mixinとは?

ruby初心者ですが、rubyやってる人が「mixinおもしろいよ!使い方間違えると大変なことになるけどw」とか言ってるの聞いて気になったので調べてみた。

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。
[参照] http://ja.wikipedia.org/wiki/Mixin
(Rubyでは当てはまらないとの指摘を受けたので取り消しておきます)

お、おう。

なんとなくは分かった気になるけど、どういう動作するんだろう???

ということでやってみる。

参考

Rubyのmoduleをmix-inする際のincludeとextendの違いをシンプルな例で理解する(ほぼそのまま実践させていただきました)

ソース

mixin するモジュール

my_module.rb
# 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

ソース

sample_include.rb
# 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

ソース

sample_extend.rb
# 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

35
37
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?