赤き血のイレブン

自分の復習ネタを書いてます。

Effective Ruby②

雑談

昨日はなでしこと北朝鮮東アジアカップでしたが、結果は残念でした。 DFが全然ダメでしたね。。

でも、杉田のミドルはすごかった! 男子でもあんなシュートを決めるのは稀ですからね。。。

今日は男子、昨日のなでしこの借りを返してほしい。

本題

前回に続きEffective Rubyです。。

superって

親子関係になるときに子からオーバーライドした親のメソッドを呼び出すのにsuperを使うんですけどね。。 気をつけないと引数の数がダメ―と怒られます。。

例えばこんな感じ

[1] pry(main)> class A
[1] pry(main)*   def a1(a=nil)
[1] pry(main)*     puts a
[1] pry(main)*   end
[1] pry(main)* end
=> :a1
[2] pry(main)> class B < A
[2] pry(main)*   def a1(a,b)
[2] pry(main)*     super # 親のメソッドを呼び出すが。。。
[2] pry(main)*   end
[2] pry(main)* end
=> :a1
[3] pry(main)> B.new.a1('a','b')
ArgumentError: wrong number of arguments (2 for 0..1)
from (pry):2:in `a1'

イメージとしたら引数を省略して呼び出したいときにsuperって書くとダメみたいで superだと、同じメソッドが呼び出されるようで引数も同じ数だけ渡されるようです。

上の例だと super super(a,b) って呼び出されているようなので、 引数を2つ許容するメソッドがないためエラーになります。

じゃあ、省略して渡すにはどうするか そう()つけるんですね。。。

[4] pry(main)> class C < A
[4] pry(main)*   def a1(a,b)
[4] pry(main)*     super() # 引数なしの親メソッドを呼び出し
[4] pry(main)*   end
[4] pry(main)* end
=> :a1
[5] pry(main)> C.new.a1('a','b')

=> nil

super() だと引数の省略で呼べるので間違えないように覚えておかないといかんですね。。。