Changes in new versions / Ruby 3.2

# 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