Добавить пару ключ/значение в хэш с
в Ruby можно добавлять значения к существующим массивам с помощью
a = []
a << "foo"
но, вы также можете добавить пары ключ / значение к существующему хэшу?
h = {}
h << :key "bar"
Я знаю, что вы можете сделать:
h[:key] = ""
h[:key] << "bar"
но это не я хочу.
спасибо.
6 ответов:
здесь
merge!.h = {} h.merge!(key: "bar") # => {:key=>"bar"}
поскольку хэши не упорядочены по своей сути, нет понятия добавления. Однако рубиновые хэши с 1.9 поддерживают порядок вставки. Вот способы добавления новых пар ключ / значение.
самое простое решение-это
h[:key] = "bar"если вы хотите метод, использовать
store: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
Нет, я не думаю, что вы можете добавить пары ключ/значение. Единственная вещь ближе что я знаю, это использование
storeспособ:h = {} h.store("key", "value")
возможно, вы хотите хэш#слияние ?
1.9.3p194 :015 > h={} => {} 1.9.3p194 :016 > h.merge(:key => 'bar') => {:key=>"bar"} 1.9.3p194 :017 >Если вы хотите изменить массив на месте использовать
merge!1.9.3p194 :016 > h.merge!(:key => 'bar') => {:key=>"bar"}
Я должен был сделать то же самое, но мне нужно было добавить значения с теми же ключами. Когда я использую слияние или обновление, я не могу нажимать значения с теми же ключами. Поэтому мне пришлось использовать массив хэшей.
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
как они похожи,
merge!иstoreлечения существующей хэши по-разному в зависимости от имен клавиш, и поэтому будет влиять на ваши предпочтения. Кроме этого с точки зрения синтаксиса,merge!' skey: "value"синтаксис близко соответствует JavaScript и Python. Лично я всегда ненавидел пары ключ-значение, разделенные запятыми.hash = {} hash.merge!(key: "value") hash.merge!(:key => "value") puts hash
{:key=>"value"}hash = {} hash.store(:key, "value") hash.store("key", "value") puts hash
{:key=>"value", "key"=>"value"}получить оператор лопаты
<<работает, я бы посоветовал использовать Марк Томас'ы ответ.
Comments