ようへいの日々精進XP

よかろうもん

2018 年 01 月 30 日(火)

ジョギング

  • 香椎浜 x 2 周
  • 左側の足が踵から太ももにかけて痛い
  • デポに取り寄せしてもらっていた靴が届いたらしい

日課

  • (腕立て x 50 + 腹筋 x 30) x 3

夕飯

  • ウィークデーはほぼ鍋なので, 新たな鍋を模索したい

今日のるびぃ ~ private メソッドを含む module を mix-in した場合... ~

昨日の続き. private メソッドを含むクラスを継承して private なメソッドを継承先で呼んだ場合, レシーバー付きでも呼ぶことが出来た.

[1] pry(main)> class C
[1] pry(main)*   private
[1] pry(main)*   def my_private_method
[1] pry(main)*     'my_private_method'
[1] pry(main)*   end  
[1] pry(main)* end  
=> :my_private_method
[2] pry(main)> class C2 < C
[2] pry(main)*   def my_private_method
[2] pry(main)*     super
[2] pry(main)*   end  
[2] pry(main)* end  
=> :my_private_method
[3] pry(main)> c = C.new
=> #<C:0x00562c946b2ee0>
[4] pry(main)> c.my_private_method # レシーバー付きでは呼べない
NoMethodError: private method `my_private_method' called for #<C:0x00562c946b2ee0>
from (pry):13:in `__pry__'
[5] pry(main)> c2 = C2.new
=> #<C2:0x00562c9471dd58>
[6] pry(main)> c2.my_private_method # 継承したクラスであれば, レシーバ付きでも呼べる
=> "my_private_method"

では, 同様に private メソッドを含む module を mix-in した場合...

[1] pry(main)> module M
[1] pry(main)*   private
[1] pry(main)*   def my_private_method
[1] pry(main)*     'my_private_method'
[1] pry(main)*   end  
[1] pry(main)* end  
=> :my_private_method
[2] pry(main)> class C
[2] pry(main)*   include M
[2] pry(main)* end  
=> C
[3] pry(main)> c = C.new
=> #<C:0x0056065770c638>
[4] pry(main)> c.my_private_method # mix-in した場合には private なメソッドは呼べない
NoMethodError: private method `my_private_method' called for #<C:0x0056065770c638>
from (pry):11:in `__pry__'
[5] pry(main)> class C2
[5] pry(main)*   include M
[5] pry(main)*   public :my_private_method # どうしても呼びたければ, public メソッドで再定義する
[5] pry(main)* end  
=> C2
[6] pry(main)> c = C2.new
=> #<C2:0x00560657794d08>
[7] pry(main)> c.my_private_method
=> "my_private_method"

ふむふむ.