introspection/instance_variable_set_frozen_no_parens.rb

tests/_examples/introspection/instance_variable_set_frozen_no_parens.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