# requires Ruby 3.2 or newer
# *** before: ***
MeasureOld = Struct.new(:amount, :unit) do
def to_s
"#{amount} #{unit}"
end
end
m_old = MeasureOld.new(10, "km")
m_old.amount = 20 # a Struct instance stays mutable
# *** in version 3.2: ***
Measure = Data.define(:amount, :unit) do
def to_s
"#{amount} #{unit}"
end
end
m = Measure.new(amount: 10, unit: "km")
puts m
# m.amount = 20 # NoMethodError, Data objects are immutable