簡易的なクラスを作成できる。
構造体のメンバに対するアクセスメソッドが定義されている。
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
参考
Sandi Metz. オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 (Japanese Edition) (p.80). Kindle 版.