Freezing the initializer after passing the args to super
makes the object immutable.
# frozen_string_literal: true
# Freezing the initializer after passing the args to `super` makes the object immutable.
#
# Example:
#
# require 'value_object'
#
# ForcePullData = Struct.new(:repository_name, :site_id, keyword_init: true) do
# include ValueObject
# end
#
# data = ForcePullData.new(repository_name: 'sandbox', site_id: 'site-id')
#
# > data.repository_name
# => "sandbox"
#
# > data.repository_name = "plaything"
# FrozenError: can't modify frozen ForcePullData:
# #<struct ForcePullData repository_name="sandbox", site_id="site-id">
module ValueObject
def initialize(**args)
super(args)
freeze
end
end
This trick comes from Polished Ruby Programming by Jeremy Evans.