2013-09-04 1 views
1

Я просматривал документ рубин ядра и увидел этот метод:Ruby local_variables возвращает: символы?

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

Почему это возвращение: а и не? Я думал, что символ «:» зарезервирован для символов, но символ: a не указывает на переменную a и на ее присвоенное значение, 2.

Кроме того, как бы я мог обратиться к фактическим переменным через это метод? Как и в b = local_variables.first (будет 2, но есть: a).

Есть ли причина этого поведения, что это такое?

Благодаря/

ответ

5

Почему это возвращение: а и не? Я думал, что «:» зарезервировано для символов

Ожидаемое поведение. Согласно docs:

Возвращает имена текущих локальных переменных.

Так что да, это просто возвращает массив символов.


Кроме того, как бы я идти о доступе фактических переменных с помощью этого метода?

Как отметил Джонатан Камениш, Ruby 2.1 введена Binding#local_variable_get:

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

Для старших рубины, вы могли бы использовать eval:

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

Есть ли причина такого поведения, что это?

В символах Рубиновых используются для ссылок:

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

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

Вместо 'eval (: a.to_s)', вы можете использовать 'binding.local_variable_get (: a)'. Поэтому для перечисления всех входов или локальных переменных: 'def show_inputs (a, b, c)' 'Hash [local_variables.map {| name | [name, binding.local_variable_get (name)]}] ' ' end' 'show_inputs ('one', 'two', 'three')' '# => {: a =>" one ",: b => «two»,: c => «three»} ' –

+0

Итак, это не работает очень хорошо. Вот что я имел в виду, чтобы выглядеть так: https://gist.github.com/jcamenisch/f7a3daee296e619086c9 –

+1

@JonathanCamenisch спасибо, я обновил свой ответ – Stefan

1

как бы я идти о доступе фактических переменных с помощью этого метода?

Humm.here вы можете пойти: -

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

Почему это возвращение: а и не?

Этот ответ был задан @Stefan. Но вы можете получить здесь несколько больше вкуса: -

13 Ways of Looking at a Ruby Symbol

Из них ниже связан с вашим ответом: -

7. Символ рубин является идентификатором рубин

В Ruby мы можем искать идентификаторы (переменные, методы и константные имена) во время работы программы. Обычно это делается с использованием символов.

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 
+0

Спасибо за эту ссылку, это помогло много – ZirconCode

3

Почему это возвращение: а и не?

Он не может вернуться a, потому что a является переменной и переменные не являются объектами в Ruby. Методы могут принимать, возвращать и манипулировать объектами.