Struct は、いくつかの 属性 をまとめた軽量なクラスを簡潔に作成するために、Rubyに組み込まれたクラスです。コンストラクタ、アクセッサ、等価性などを自動的に生成し、フルのクラスを書くことなく簡潔なデータクラスを定義できます。
Structが解決する問題
,
()
= x
= y
()
x == other.x && y == other.y
= .new(, )
Struct.new(:x, :y)は、コンストラクタ、xとyのattr_accessor、値ベースの等価性、to_sなどを備えたクラスを生成し、単純なデータクラスの定型コードを排除します。
Point = Struct.new(:x, :y)
p = Point.new(1, 2)
p.x # 1 — accessor generated
p.y = 5 # setter generated
p == Point.new(1, 5) # true — VALUE-based equality (generated)
p.to_a # [1, 5] — convertible
# Structs can have methods too
Point = Struct.new(:x, :y) do
def distance_from_origin
Math.sqrt(x**2 + y**2)
end
end
Point.new(3, 4).distance_from_origin # 5.0
Structはアクセッサと 値ベースの等価性 を提供します(等しい属性を持つ2つのstructは等しい — データオブジェクトに便利)。ブロック内でカスタムメソッドを追加することもできます。
# keyword arguments (clearer for many fields)
Point = Struct.new(:x, :y, keyword_init: true)
Point.new(x: 1, y: 2)
# Data (Ruby 3.2+) — an IMMUTABLE alternative to Struct (for value objects)
Point = Data.define(:x, :y)
p = Point.new(1, 2)
p.x # 1 (read-only — immutable)
p2 = p.with(x: 5) # non-destructive copy with a change
Ruby 3.2の Data はStructの不変バリアント — 変更されるべきでない値オブジェクトに理想的です。
Structは 定型コードなしで簡単なデータクラスを素早く作成する ために便利なRuby機能であり、それを理解することは簡潔でクリーンなRubyを書くために価値があります。
コア機能は、単純なデータ保持クラスが必要とする繰り返しコードを排除することです — コンストラクタ、attr_accessor、等価性を備えたフルクラスを書く代わりに、Struct.new(:x, :y)は1行でそのすべてを生成します。これには 値ベースの等価性 も含まれます(等しい属性を持つ2つのstructは等しく、これはデータオブジェクトに望まれるもので、通常のクラスの参照等価性とは異なります)。
これにより、Structは軽量なデータ構造、値オブジェクト、メソッドからのグループ化された値の返却、フルクラスが過剰な単純なレコードに理想的です — コードを簡潔に保つ実用的な生産性ツールです。
Struct(生成されたアクセッサと値等価性を持つ簡潔なデータクラス、さらにカスタムメソッドを追加する機能)、キーワード初期化struct(多くのフィールドでより明確)、モダンな Data クラス(Ruby 3.2の変更されるべきでない値オブジェクト向けの不変代替案)を理解することは、価値のある知識です。
小規模なデータクラスの定義は一般的なニーズであり、Struct(およびData)はそれを行うための簡潔でイディオマティックな方法を提供します。特に値等価性(有用な生成動作)があるため、フルクラスに対してStruct/Dataをいつ選択するかを知ることは、実用的で関連性のあるRuby知識です — クリーンで簡潔なコードを書くことを反映しています。関連する属性を軽量な型にバンドルするという頻繁なタスクのためのRuby開発者のツールキットにおける有用なツールであり、簡潔性と定型コード削減に対するRubyの強調を体現しています。