В Ruby, можно добавить значения для существующих массивов с использованием <<:
a = []
a << "foo"
но, можно также добавлять пары ключ/значение к существующему хэш?
h = {}
h << :key "bar"
Я знаю, что вы можете сделать:
h[:key] = ""
h[:key] << "bar"
но, что's не хочу.
Спасибо.
Поскольку хэши не'т быть упорядочены, нет'т понятие присоединения. В Ruby хэши с 1.9 поддерживать порядок вставки, однако. Вот несколько способов для добавления новой пары ключ/значение.
Самое простое решение
h[:key] = "bar"
Если вы хотите способ, использовать "магазин":
h.store(:key, "bar")
Если вы действительно, действительно хотите использовать на "совок" и оператор (<<
), на самом деле добавляя к значению хэш в массив, и вы должны указать ключ:
h[:key] << "bar"
Выше работает только когда ключ существует. Чтобы добавить новый ключ, вы должны инициализировать хэш со значением по умолчанию, которые вы можете сделать как этот:
h = Hash.new {|h, k| h[k] = ''}
h[:key] << "bar"
Вы можете быть уговорены для того, чтобы обезьяна патч хэш включить, машинист экскаватора, который работает так, как вы'вэ написано:
class Hash
def <<(k,v)
self.store(k,v)
end
end
Однако, это не'т наследовать в "синтаксический сахар" в случае, машинист экскаватора в других контекстах:
h << :key, "bar" #doesn't work
h.<< :key, "bar" #works
Нет, я не'т думаю, что вы можете добавлять пары ключ/значение. Единственное, что ближе что я знаю о том, используя магазин
метод:
h = {}
h.store("key", "value")
Возможно, вы хотите хэш#слияние ?
1.9.3p194 :015 > h={}
=> {}
1.9.3p194 :016 > h.merge(:key => 'bar')
=> {:key=>"bar"}
1.9.3p194 :017 >
Если вы хотите изменить массив в месте слияния!`
1.9.3p194 :016 > h.merge!(:key => 'bar')
=> {:key=>"bar"}
Мне приходилось делать подобное, но мне нужно, чтобы добавить значения с одинаковыми ключами. Когда я использую слияния или обновления я могу't нажмите значения с одинаковыми ключами. Поэтому мне пришлось использовать массив хэшей.
my_hash_static = {:header =>{:company => 'xx', :usercode => 'xx', :password => 'xx',
:type=> 'n:n', :msgheader => from}, :body=>[]}
my_hash_dynamic = {:mp=>{:msg=>message, :no=>phones} }
my_hash_full = my_hash_static[:body].push my_hash_dynamic
Подобно тому, как они не сливаются!и
магазинлечить _existing_ хэши по-разному в зависимости от параметров, и, следовательно, повлияет на ваши предпочтения. Кроме того, что с точки зрения синтаксиса, сливаться друг с другом!
's ключ: "в значении"
в синтаксис соответствует против JavaScript и Python. Я'ключ-значение ве всегда ненавидел запятая-разделение пар, лично.
hash = {}
hash.merge!(key: "value")
hash.merge!(:key => "value")
puts hash
{:ключ=> наша"ценности" и}
hash = {}
hash.store(:key, "value")
hash.store("key", "value")
puts hash
{:ключ=>"в значении" и, "по ключ" в=> наша"ценности" и}
Чтобы получить машинист экскаватора <<
работает, я бы посоветовал использовать Марк Томас'ы ответ.