Ruby: Самостоятельная ссылка в хеше

Можно ли ссылаться на один элемент в хэше в другом элементе в том же хэше?

# Pseudo code
foo = { :world => "World", :hello => "Hello #{foo[:world]}" }
foo[:hello] # => "Hello World"

Ответы

Ответ 1

Косвенно возможно...

foo = { :world => 'World', :hello => lambda { "Hello #{foo[:world]}" }}

puts foo[:hello].call

Ответ 2

Если вы хотите, чтобы значения некоторых ключей зависели от других:

foo = Hash.new{|h, k|
   case k
   when :hello; "Hello #{h[:world]}"
   when :bye; "Bye #{h[:world]}"
   end
}
foo[:world] = 'World'
foo[:hello] # => 'Hello World'
foo[:bye] # => 'Bye World'
foo[:world] = 'Heaven'
foo[:hello] # => 'Hello Heaven'
foo[:bye] # => 'Bye Heaven'

Ответ 3

Это невозможно сделать напрямую, потому что "" строго оценивается.

Требуется использование генератора ленивого значения (например, лямбда /proc ) с последующей оценкой.

Счастливое кодирование.

Ответ 4

Нет.

По крайней мере, не в один шаг. Вы можете сделать что-то вроде:

foo = {world: "hello"}
foo[:hello] = "Hello #{foo[:world]}"

Ответ 5

Конечно, вы можете!

options = { :deep => :stuff }
options.merge!(:options => options)

# It the same at any depth...
options[:options][:options][:options][:options][:options]
  #=> {:deep=>:stuff, :options=>{...}}

Аккуратно, да? Хэш-объект в options имеет тот же object_id, что и значение, присвоенное :options.