introspection/remove_instance_variable.rb

tests/_examples/introspection/remove_instance_variable.rb in the metorex repository.

class Greeter
  def initialize
    @greeting = "hello"
    @name = "world"
  end
end

greeter = Greeter.new
puts greeter.instance_variables.inspect
puts greeter.remove_instance_variable(:@greeting).inspect
puts greeter.instance_variables.inspect
puts greeter.instance_variable_defined?(:@greeting)

puts greeter.remove_instance_variable("@name").inspect
puts greeter.instance_variables.inspect

begin
  greeter.remove_instance_variable(:@unknown)
rescue NameError => error
  puts "#{error.class}: #{error.message}"
end

begin
  greeter.remove_instance_variable(:"@0")
rescue NameError => error
  puts "#{error.class}: #{error.message}"
end

begin
  greeter.remove_instance_variable(Object.new)
rescue TypeError => error
  puts error.class
end

class Name
  def to_str
    "@greeting"
  end
end

reborn = Greeter.new
puts reborn.remove_instance_variable(Name.new).inspect

frozen = Greeter.new
frozen.freeze
begin
  frozen.remove_instance_variable(:@greeting)
rescue FrozenError => error
  puts error.class
end

begin
  nil.remove_instance_variable(:@anything)
rescue FrozenError => error
  puts error.class
end

begin
  nil.remove_instance_variable(:not_a_variable)
rescue NameError => error
  puts error.class
end

puts Kernel.public_instance_methods(false).include?(:remove_instance_variable)

Output:

[:@greeting, :@name]
"hello"
[:@name]
false
"world"
[]
NameError: instance variable @unknown not defined
NameError: `@0' is not allowed as an instance variable name
TypeError
"hello"
FrozenError
FrozenError
NameError
true