モジュールと bang(破壊的)メソッド

今日はじめて気づいたこと。
reject は Enumerable にあるが、reject! は Array にある

$ ruby -e '
class MyClass
   include Enumerable

   def initialize
      @a = 1
      @b = 2
      @c = 3
   end

   def each
      yield @a
      yield @b
      yield @c
   end
end

o = MyClass.new
p o.reject{|e| e == 2}

p o.reject!{|e| e == 2}
'
[1, 3]
-e:19: undefined method `reject!' for #<MyClass:0x100e6218 @c=3, @b=2, @a=1> (NoMethodError)

あー、そりゃそうだわな。Enumerable が削り方知ってるわきゃないもん。
モジュールは bang(破壊的)メソッドを定義できない、っと。


ん? 追加・削除のメソッドがインクルード元で定義してあればいけるか? いやいやいやいや、まあまあまあまあ、まーまままままままま、おっとっとっとっと。