🐥
一日一処: Rubyでもオーバーロードでキメラを生み出したい
演算子オーバーロード
前回、Scalaの演算子オーバーロードを用いて、人と人を融合させる禁忌を犯した。今度はRubyでも行う。
人クラス
実際のところ、ScalaもRubyも雰囲気が似ているので、別の言語で同じことをわざわざ再現する必要はないが、同じようなことを同じ様にできるということをちゃんと表現しておきたいと思うので、これを記述する。
人クラスは、Scalaと同じものにする。
class Human
def initialize(name, age)
@name = name
@age = age
end
end
bob = Human.new('bob', 20)
alice = Human.new('alice', 20)
puts bob + alice
まずは、何もせず実行すると、最後の加算演算子で、エラーが発生する。
undefined method +
とのことだ。Rubyでは、演算子はメソッドとして認識されている(例:abc.+(def)
)ため、メソッドを追加してあげれば問題ない。
class Human
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
def +(human)
Human.new(
(@name + human.name).split('').shuffle.join,
@age + human.age
)
end
end
bob = Human.new('bob', 20)
alice = Human.new('alice', 20)
chimera = bob + alice
puts chimera.name
# oeabclib
キメラが作れた。ScalaにしてもRubyにしても、冒頭に書いた通り、コードの差異はあまりなかった。というよりかは、ほぼ同じコードだ。シンプルに書けるのはいいことだ。
Discussion