RosettaCodeData/Task/Add-a-variable-to-a-class-instance-at-runtime/Crystal/add-a-variable-to-a-class-instance-at-runtime.cr
2026-04-30 12:34:36 -04:00

25 lines
510 B
Crystal

class SuperDynamic
@vars = {} of String => String | Int32
def set_vars (@vars)
end
macro method_missing (call)
{% name = call.name %}
{% if name.ends_with? "=" %}
{% name = name.gsub(/=$/, "") %}
raise "unknown var" unless @vars.has_key? {{name.id.stringify}}
@vars[{{name.id.stringify}}] = {{call.args[0].id}}
{% else %}
@vars[{{name.id.stringify}}]
{% end %}
end
end
sd = SuperDynamic.new
sd.set_vars({ "a" => 1, "b" => "2" })
p! sd.a
sd.a = 99
p! sd.a