No existen métodos especiales para indagar o dar valores a las variables locales y globales pero siempre es posible usar eval para eso:
x = 1 varname = "x" eval(varname) # => 1 eval("varname = '$g'") # Set varname to "$g" eval("#{varname} = x") # Set $g to 1 eval(varname) # => 1Cualesquiera variables que se definen dentro de un
eval
son locales al eval
ydejan de existir cuando este retorna.
Es posible preguntar por el valor, poner el valor y comprobar la existencia de variables de instancia de cualquier objeto y de variables y constantes de clase (o módulo):
o = Object.new o.instance_variable_set(:@x, 0) # Note required @ prefix o.instance_variable_get(:@x) # => 0 o.instance_variable_defined?(:@x) # => true Object.class_variable_set(:@@x, 1) # Private in Ruby 1.8 Object.class_variable_get(:@@x) # Private in Ruby 1.8 Object.class_variable_defined?(:@@x) # => true; Ruby 1.9 and later Math.const_set(:EPI, Math::E*Math::PI) Math.const_get(:EPI) # => 8.53973422267357 Math.const_defined? :EPI # => true
String.class_eval { class_variable_set(:@@x, 1) } # Set @@x in String String.class_eval { class_variable_get(:@@x) } # => 1
o.instance_eval { remove_instance_variable :@x } String.class_eval { remove_class_variable(:@@x) } Math.send :remove_const, :EPI # Use send to invoke private method
def Symbol.const_missing(name) name # Return the constant name as a symbol end Symbol::Test # => :Test: undefined constant evaluates to a Symbol
Casiano Rodriguez León 2015-01-07