metaprogramming/class_variable_set_parens.rb

tests/_examples/metaprogramming/class_variable_set_parens.rb in the metorex repository.

# Module#class_variable_set — written with parentheses. Sets a class
# variable by name, returns the assigned value, raises FrozenError when the
# receiver is frozen, and mixes in a duplicated module via `include(Mod.dup)`.
module Flags
  @@flag = :off
end

klass = Class.new { include(Flags.dup) }
puts(klass.class_variable_set("@@flag", :on))
puts(klass.class_variable_get(:@@flag))

other = Class.new
puts(other.class_variable_set(:@@count, 3))
puts(other.class_variable_get(:@@count))

begin
  Class.new.freeze.class_variable_set(:@@x, 1)
rescue FrozenError
  puts("frozen Class raises FrozenError")
end

begin
  Module.new.freeze.class_variable_set(:@@x, 1)
rescue FrozenError
  puts("frozen Module raises FrozenError")
end

Output:

on
on
3
3
frozen Class raises FrozenError
frozen Module raises FrozenError