tusbasaのブログ

業務や勉強中に調べたことを自分用にメモするブログ

【Ruby】Struct

簡易的なクラスを作成できる。

構造体のメンバに対するアクセスメソッドが定義されている。

User = Struct.new(:name, :age)

user = User.new("taro", 20)

user.name
=> "taro"

user.age
=> 20


複雑なデータ構造を振る舞いに変換する際に便利。 「振る舞いに変換する」とはStructを使って作成したアトリビュートが特定のメソッドに反応できることを指す。(構造体のメンバに対するアクセスメソッドが定義されている為可能)


データ構造を隠蔽している。 渡されるdataの構造が変わってもbodyメソッドだけを変更すれば良い。

# data = [180, 65]

class User
  attr_reader :data, address

  def initialize(data, address)
    @address = address
    @body = body(data)
  end

  class Body < Struct.new(:height, :weight)
  end
  
  # データ構造を振る舞いに変換する
  # データの構造を知らなくても欲しい値を取得できるようになる
  def body(data)
    Body.new(data[0], data[1])
  end

  # このメソッドはデータの構造を知らなくても良くなった
  def bmi
    body.weight / (body.height / 100)**2
  end
end


データ構造をそのままインスタンスに反映してしまっている。 このインスタンスを引数にとるメソッドがある場合そのメソッドもdataの構造を知る必要が出てくる 。 渡されるdataの構造が変わるとdataを参照している箇所全てを変更しなければならなくなる。

# data = [180, 65]

class User
  attr_reader :data, address

  def initialize(data, address)
    @address = address
    @data = data
  end

  def bmi
    data[1] / (data[0] / 100)**2
  end
end

参考

qiita.com

Sandi Metz. オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 (Japanese Edition) (p.80). Kindle 版.