metaprogramming/class_variable_set.rb

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

# Module#class_variable_set — written without 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