Effective Ruby: superってメソッドとちゃうんやで
項目7 superのふるまいがひと通りでないことに注意しよう
- 作者: Peter J. Jones,arton,長尾高弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/09
- メディア: 大型本
- この商品を含むブログ (13件) を見る
super
super
ってメソッドではなくキーワードだったんですね。
super
とsuper()
で挙動が異なるなんて知りませんでした!
(もしかすると昔学んだかもしれないが、忘れている。)
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