Вот еще один способ, который я предлагаю, потому что: а) стандартные подходы уже упоминались в ранее опубликованных ответах; и б) вы можете найти его поучительным, если не немного странным.
Что мы будем делать это создать пустой хэш h
, а затем выполнить:
a.each { |k| h[k] }
и вуаля!
h => {1=>{2=>3}, 2=>{3=>4}, 3=>{4=>5}}
«Как это может быть?», Вы, вероятно, думаете. Фокус в том, как мы определяем хеш h
; а именно, мы используем форму методы класса Hash::new, который принимает блок:
h = Hash.new { |h,(x,(y,z))| h[x] = { y=>z } }
Это обычно используется следующим образом:
h = Hash.new { |h,k| h[k] = ... } }
Это говорит, что, когда h
передается ключ k
, что уже не в хеше, блок должен быть выполнен для вычисления значения, связанного с новым ключом. Однако нам не нужно использовать k
. Здесь я передаю элемент a
, который я написал в его разложенной форме (или «disambiguted»), (x,(y,z))
, а затем добавив пару ключей-значений x => { y=>z }
к хэшу.
Это может быть вместо этого написано:
h = Hash.new { |h,k| h[k.first] = { k.last.first=>k.last.last } }
, но я надеюсь, вы согласитесь, что разложившийся форма намного легче читать.
Вместо:
h = Hash.new { |h,(x,(y,z))| h[x] = { y=>z } }
a.each { |k| h[k] }
h
более рубин как способ:
a.each_with_object(Hash.new { |h,(x,(y,z))| h[x] = { y=>z } }) { |k,h| h[k] }
Пожалуйста, покажите, что вы пробовали до сих пор. –
Вы должны проверить синтаксис своего массива, выражение '[2,] [3,4]' оценивается как 'nil', поэтому массив фактически эквивалентен:' [[[1, [2, 3]], nil], [3, [4, 5]]] ', что, вероятно, не то, что вы хотите. – toro2k
Вы контролируете, откуда этот массив? Не могли бы вы изменить код для вывода в требуемом формате? –