Ответ 1
Косвенно возможно...
foo = { :world => 'World', :hello => lambda { "Hello #{foo[:world]}" }}
puts foo[:hello].call
Можно ли ссылаться на один элемент в хэше в другом элементе в том же хэше?
# Pseudo code
foo = { :world => "World", :hello => "Hello #{foo[:world]}" }
foo[:hello] # => "Hello World"
Косвенно возможно...
foo = { :world => 'World', :hello => lambda { "Hello #{foo[:world]}" }}
puts foo[:hello].call
Если вы хотите, чтобы значения некоторых ключей зависели от других:
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'
Это невозможно сделать напрямую, потому что ""
строго оценивается.
Требуется использование генератора ленивого значения (например, лямбда /proc ) с последующей оценкой.
Счастливое кодирование.
Нет.
По крайней мере, не в один шаг. Вы можете сделать что-то вроде:
foo = {world: "hello"}
foo[:hello] = "Hello #{foo[:world]}"
Конечно, вы можете!
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
.