Добавить пару ключ/значение в хэш с



в Ruby можно добавлять значения к существующим массивам с помощью


a = []
a << "foo"


но, вы также можете добавить пары ключ / значение к существующему хэшу?



h = {}
h << :key "bar"


Я знаю, что вы можете сделать:



h[:key] = ""
h[:key] << "bar"


но это не я хочу.



спасибо.

671   6  

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! ' s key: "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

    Ничего не найдено.