Question

I was looking through the ruby Kernel doc and saw this method:

a = 2
local_variables # => [:a, :_]

Why does it return :a and not a? I thought the ":" was reserved for symbols, but the symbol :a doesn't point to the variable a nor to it's assigned value, 2.

Furthermore, how would I go about accessing the actual variables through this method? As in b=local_variables.first (would be 2, but is :a).

Is there a reason behind this behavior, what is it?

Thanks/

Was it helpful?

Solution

Why does it return :a and not a? I thought the ":" was reserved for symbols

It's the expected behavior. According to the docs:

Returns the names of the current local variables.

So yes, this just returns an array of symbols.


Furthermore, how would I go about accessing the actual variables through this method?

As noted by Jonathan Camenisch, Ruby 2.1 introduced Binding#local_variable_get:

a = 2
binding.local_variable_get(:a)
#=> 2

For older Rubies, you could use eval:

a = 2
eval(:a.to_s)
#=> 2

Is there a reason behind this behavior, what is it?

In Ruby symbols are used for references:

"foo".methods
#=> [:<=>, :==, :===, :eql?, :hash, :casecmp, ...]

Module.constants
#=> [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, ...]

OTHER TIPS

Why does it return :a and not a?

It can't return a, because a is a variable and variables aren't objects in Ruby. Methods can only take, return, and manipulate objects.

how would I go about accessing the actual variables through this method?

Humm.here you can go:-

a = 2
b = 10
local_variables.each{|e| p eval(e.to_s)}
# >> 2
# >> 10

Why does it return :a and not a?

That answer has been given by @Stefan. But you can get here some more taste:-

13 Ways of Looking at a Ruby Symbol

Out of these the below is related to your answer:-

7. A Ruby symbol is a Ruby identifier

In Ruby, we can look up identifiers (variable, methods and constant names) while the program is running. This is typically done using symbols.

class Demo
  # The stuff we'll look up.
  DEFAULT = "Hello"
  def initialize
    @message = DEFAULT
  end
  def say() @message end

  # Use symbols to look up identifiers.
  def look_up_with_symbols
    [Demo.const_get(:DEFAULT),
     method(:say),
     instance_variable_get(:@message)]
  end
end

Demo.new.look_up_with_symbols
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top