構造体を継承する(Ruby)

上の本を読んでいたところ、本書の内容そのものには関係がないのですが、Ruby の構造体クラスの斬新な使い方に驚いたのでメモしておきます。(本書は内容そのものも大変におもしろいです。いま読んでいるところですが、オススメです。)

こんな感じ。Ruby の構造体は、Struct.new もまたクラスなので、これを継承できるのです(Structクラスを継承するのではないですよ)。Vector クラスを作って、ベクトルの和と内積を実装してみました。

class Vector < Struct.new(:x, :y)
  def +(a)
    Vector.new(self.x + a.x, self.y + a.y)
  end
  
  def *(a)
    self.x * a.x + self.y * a.y
  end
end

v1 = Vector.new( 1, 4)
v2 = Vector.new(-3, 2)
p v1 + v2    #=><struct Vector x=-2, y=6>
p v1 * v2    #=>5

こういう仕方で構造体を使うのは初めて見ました。自分が知らないだけですか? ただこれだと、attr_accessor が使えません。これは不便ですね。


※参考:
class Struct (Ruby 2.2.0)