Я не эксперт по Ruby. Но для технически сумасшедшего клуге ... это сработало бы, если бы вы чувствовали необходимость проходить через eval
каждый раз, когда вы работали с переменной:
>> a = 5
=> 5
>> b = :a
=> :a
>> eval "#{b} = 4"
=> 4
>> eval "#{a}"
=> 4
>> eval "#{b}"
=> 4
Обратите внимание, что прямое использование b
все равно даст вам :a
, и вы не сможете использовать его в выражениях, которых нет в eval
:
>> b
=> :a
>> b + 1
NoMethodError: undefined method `+' for :a:Symbol
... и, конечно, есть тонна предостережений. Например, вам нужно захватить binding
и передать его в более сложных сценариях ...
«передать параметр по ссылке» в Ruby?
@Paul.s имеет ответ, если вы можете изменить точку объявления на объект-оболочку, но если вы можете управлять только точкой ссылки, то вот класс BasicReference
, который я пробовал:
class BasicReference
def initialize(r,b)
@r = r
@b = b
@val = eval "#{@r}", @b
end
def val=(rhs)
@val = eval "#{@r} = #{rhs}", @b
end
def val
@val
end
end
a = 5
puts "Before basic reference"
puts " the value of a is #{a}"
b = BasicReference.new(:a, binding)
b.val = 4
puts "After b.val = 4"
puts " the value of a is #{a}"
puts " the value of b.val is #{b.val}"
Это выводит:
Before basic reference
the value of a is 5
After b.val = 4
the value of a is 4
the value of b.val is 4