mainオブジェクトにおけるincludeとextendの違い - 百聞は1ソースに如かず

includeだと

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module Tiger
  def eat
    'meat'
  end
end

class Cow
  def self.eat
    'vegetable'
  end
end

class Rabbit
end

include Tiger
#extend Tiger

puts "myself(wanna be Tiger) eat #{self.eat}" #=> myself(wanna be Tiger) eat meat
puts "Cow eats #{Cow.eat}" #=> Cow eats vegetable
puts "Rabbit eats #{Rabbit.eat}" #=> Rabbit eats meat

ウサギさんが肉を食べてしまいます(Objectが汚染されてます)

excludeだと

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module Tiger
  def eat
    'meat'
  end
end

class Cow
  def self.eat
    'vegetable'
  end
end

class Rabbit
end

#include Tiger
extend Tiger

puts "myself(wanna be Tiger) eat #{self.eat}" #=> myself(wanna be Tiger) eat meat
puts "Cow eats #{Cow.eat}" #=> Cow eats vegetable
puts "Rabbit eats #{Rabbit.eat}" #=> `<main>': undefined method `eat' for Rabbit:Class(NoMethodError)

汚染されません。Objectのインスタンスであるmainの特殊メソッドにのみmixinされたからですね。