introspection/instance_variable_set_frozen.rb
tests/_examples/introspection/instance_variable_set_frozen.rb in the metorex repository.
def try_set(obj, label)
begin
obj.instance_variable_set(:@spec, "value")
puts "#{label}: no error"
rescue FrozenError => e
puts "#{label}: #{e.class}"
end
end
try_set(true, "true")
try_set(false, "false")
try_set(nil, "nil")
try_set(42, "integer")
try_set(:sym, "symbol")
class Foo; end
f = Foo.new
f.instance_variable_set(:@x, 99)
puts "instance: #{f.instance_variable_get(:@x)}"
f.freeze
begin
f.instance_variable_set(:@x, 100)
puts "frozen instance: no error"
rescue FrozenError
puts "frozen instance: FrozenError"
end
begin
true.instance_variable_set(:@bad, 1)
rescue RuntimeError
puts "rescued via RuntimeError"
end
Output:
true: FrozenError
false: FrozenError
nil: FrozenError
integer: FrozenError
symbol: FrozenError
instance: 99
frozen instance: FrozenError
rescued via RuntimeError