Next-gen ruby libs! » github.com/dry-rb » website: https://dry-rb.org » forum: https://discourse.dry-rb.org
Struct
doesn’t do that (as it doesn’t provide writers, only readers)
Struct
already gives you “typed” objects, just doesn’t give you a way to mutate them after creation
module Dry
module Types
class Struct
class Mutable < Struct
constructor_type :schema
def self.attributes(new_schema)
super
protected_writer(*new_schema.keys)
self
end
def self.protected_writer(*writers)
writers.each do |key|
define_method("#{key}=") do |value|
instance_variable_set("@#{key}", self.class.new(key => value)[key])
end
end
end
end
end
end
end
@
in instance_variable_set/get
? I'm not aware of instance variables that don't begin with @
, always got on my nerves
.new
method
Kernel
and fix it ;) Kind of
module Dry
module Types
class Struct
class Mutable < Struct
constructor_type :schema
def self.attributes(new_schema)
super
define_protected_writers(*new_schema.keys)
self
end
def self.define_protected_writers(*writers)
writers.each do |key|
define_method("#{key}=") do |value|
instance_variable_set(
"@#{key}",
self.class.schema[key][value]
)
end
end
protected *writers
end
end
end
end
end