2011-02-11 2 views
2
array = [0, 0.3, 0.4, 0.2, 0.6] 

hash = { 
    "key1" => array[0..2], 
    "key2" => array[0..3], 
    "key3" => array, 
    "key4" => array, 
    "key5" => array, 
    "key6" => array, 
    "key7" => array 
} 

Есть ли способ я могу удалить дублирование, делая что-то вродеRuby: уменьшить дублирование во время инициализации окрошка

hash = { 
    "key1" => array[0..2], 
    "key2" => array[0..3], 
    %(key3, key4, key5, key6, key7).each {|ele| ele => array} 
} 
+0

Я думаю, что ваш первый путь более читаемым, чем любой из альтернатив. Заметим также, что если вы когда-либо планируете модифицировать key3-7, вы, вероятно, хотите '=> array.dup' вместо' => array', поскольку последний присваивает 5 ссылок на один и тот же массив. –

ответ

3
array = [0, 0.3, 0.4, 0.2, 0.6] 
h = Hash[*Array.new(7) {|x| ["key#{x+1}", array[0..(x<2?x+2:-1)]]}.flatten(1)] 
h # => {"key1" => [0, 0.3, 0.4], "key2" => [0.3, 0.4, 0.2],...} 
+1

Это должно быть читаемо? Несмотря на это, это очень приятно. –

+0

@Jacob: он не сказал * читаемый * путь! =) – maerics

+1

Было бы интересно посмотреть, какой должен быть действительный результат, если/когда в массив добавляется другой элемент. –

4

Попробуйте

array = [0, 0.3, 0.4, 0.2, 0.6] 
hash = { 
    "key1" => array[0..2], 
    "key2" => array[0..3] 
} 
%w(key3 key4 key5 key6 key7).each {|ele| hash[ele] = array} 
+0

это более читаемо, thx – user612308

+1

Я согласен с этим ответом, но вам нужно удалить запятые из вашего массива строк. – Phrogz

+0

@Phrogz сделал копию/пасту из оригинала. Исправлено в моем ответе. Благодарю. –

0

Вот несколько вариаций на тема. Они работают с 1.8.7 или 1.9.2. Порядок вставки поддерживается с 1.9.2 Потому что это то, что он делает:

require 'pp' 

array = [0, 0.3, 0.4, 0.2, 0.6] 

hash = ('key3'..'key7').entries.inject({}) { |m, e| m[e] = array; m } 
hash.merge!('key1' => array[0..2], 'key2' => array[0..3]) 
pp hash 

puts '-' * 40 

hash = { 
    'key1' => array[0..2], 
    'key2' => array[0..3] 
    }.merge(('key3'..'key7').entries.inject({}) { |m, e| m[e] = array; m }) 
pp hash 

puts '-' * 40 

# I think this is the most readable/maintainable 
hash = { 
    'key1' => array[0..2], 
    'key2' => array[0..3] 
} 
('key3'..'key7').entries.inject(hash) { |m, e| m[e] = array; m } 
pp hash 

Какой выход:

# >> {"key3"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key4"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key5"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key6"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key7"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key1"=>[0, 0.3, 0.4], 
# >> "key2"=>[0, 0.3, 0.4, 0.2]} 
# >> ---------------------------------------- 
# >> {"key1"=>[0, 0.3, 0.4], 
# >> "key2"=>[0, 0.3, 0.4, 0.2], 
# >> "key3"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key4"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key5"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key6"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key7"=>[0, 0.3, 0.4, 0.2, 0.6]} 
# >> ---------------------------------------- 
# >> {"key1"=>[0, 0.3, 0.4], 
# >> "key2"=>[0, 0.3, 0.4, 0.2], 
# >> "key3"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key4"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key5"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key6"=>[0, 0.3, 0.4, 0.2, 0.6], 
# >> "key7"=>[0, 0.3, 0.4, 0.2, 0.6]} 
0

Вот еще одна версия:

hash = { 
    "key1" => array[0..2], 
    "key2" => array[0..3] 
}.tap { |h| ("key3".."key7").each{|k| h[k]=array}} 
Смежные вопросы