Effective Ruby: superってメソッドとちゃうんやで

項目7 superのふるまいがひと通りでないことに注意しよう

Effective Ruby

Effective Ruby

super

superってメソッドではなくキーワードだったんですね。
supersuper()で挙動が異なるなんて知りませんでした!
(もしかすると昔学んだかもしれないが、忘れている。)
 

class SuperSilliness < SillyBase
  def m1(x, y)
    super(1, 2) # 1と2を渡して呼び出し
    super(x, y) # xとyを渡して呼び出し
    super x, y  # 上と同じ
    super       # 上と同じ
    super()     # 引数なしで呼び出し
  end
end

最後2つ要注意。

override

(例が微妙だけど)この場合、includeがoverrideされてしまう。
なので継承ではなく合成(composition)を使うこと検討した方が良いと指摘されている。

module CoolFeatures
  def feature_a
  end
end

class Vanilla
  include(CoolFeatures)

  def feature_a
    super # CoolFeatures#feature_a
  end
end

method_missing

通常、定義されていないsuperを呼び出すとこうなる。

class SuperHappy
  def laught
    super
  end
end

>> SuperHappy.new.laught
NoMethodError (super: no superclass method `laught' for #<SuperHappy:0x00007f84608744e8>)

method_missingを定義していると気付かない。

class SuperHappy
  def laught
    super
  end

  def method_missing(args)
    p args
  end
end

>> SuperHappy.new.laught
:laught