はじめに
python
からruby
に移植する話がありまして、ソースを見ていたところpythonに多重継承がありました。
どうしたものか。
競技プログラミング
atcoder さんには大変お世話になっているものの、class
どころかdef
もほとんど書きませんので、クラス・モジュール・継承となると再勉強が必要。
Ruby Gold も使わなければ忘れるだけですね。
Perl to Ruby
ところで、PerlユーザーのためのRuby入門 という本がございまして、例によって20年位前の本になりますが、第5章に5-2 Perl多重継承v.s. Ruby Mix-in
という興味深い記載が載っておりました。
class Staff
def initialize(hash)
p :Staff_initialize
@name = hash[:name]
end
end
module TradeStaff
def initialize(hash)
p :TradeStaff_initialize
super(hash)
@sales = hash[:sales]
@trade_skill = 10
end
end
module AdminStaff
def initialize(hash)
p :AdminStaff_initialize
super(hash)
@rooms = hash[:rooms]
@admin_skill = 10
end
end
class TradeAdminStaff < Staff
include TradeStaff
include AdminStaff
def initialize(hash)
p :TradeAdminStaff_initialize
super(hash)
end
end
p staff = TradeAdminStaff.new(
:name => "Tom",
:sales => 13000,
:rooms => ["room_001", "room_003"])
p staff = TradeAdminStaff.ancestors
[TradeAdminStaff, AdminStaff, TradeStaff, Staff, Object, Kernel, BasicObject]
ancestors
すると継承リスト
が見られますが、super
でひとつ前の継承されたメソッドが呼ばれることに少し感動しました。
まとめ
- 少し感動した
- ゆくRuby くRuby