🐥

一日一処: Rubyでもオーバーロードでキメラを生み出したい

2024/02/27に公開

演算子オーバーロード

前回、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