Подтвердить что ты не робот

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

В Ruby можно добавлять значения в существующие массивы, используя < lt;:

a = []
a << "foo"

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

Существует merge!.

h = {}
h.merge!(key: "bar")
# => {:key=>"bar"}

Ответ 2

Так как хеши по своей сути не упорядочены, нет понятия добавления. Тем не менее, рубиновые хеши с 1,9 поддерживают порядок вставки. Ниже приведены способы добавления новых пар ключ/значение.

Простейшим решением является

h[:key] = "bar"

Если вы хотите использовать метод, используйте store:

h.store(:key, "bar")

Если вы действительно хотите использовать оператор "лопата" (<<), он фактически добавляет значение хэша в виде массива, и вы должны указать ключ:

h[:key] << "bar"

Вышеупомянутое работает только тогда, когда ключ существует. Чтобы добавить новый ключ, вы должны инициализировать хэш со значением по умолчанию, которое вы можете сделать следующим образом:

h = Hash.new {|h, k| h[k] = ''}
h[:key] << "bar"

У вас может возникнуть соблазн для патча обезьяны Hash, чтобы включить оператора лопаты, который работает так, как вы написали:

class Hash
  def <<(k,v)
    self.store(k,v)
  end
end

Однако это не наследует "синтаксический сахар", применяемый к оператору лопаты в других контекстах:

h << :key, "bar" #doesn't work
h.<< :key, "bar" #works

Ответ 3

Нет, я не думаю, что вы можете добавить пары ключ/значение. Единственное, что мне известно, это использовать метод store:

h = {}
h.store("key", "value")

Ответ 4

Возможно, вы хотите слить Hash #?

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"} 

Ответ 5

Мне нужно было сделать нечто подобное, но мне нужно было добавлять значения с одинаковыми ключами. Когда я использую слияние или обновление, я не могу передавать значения с одинаковыми ключами. Поэтому мне пришлось использовать массив хешей.

    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

Ответ 6

Как и они, merge! и store обрабатывают существующие хэши по-разному в зависимости от ключевых слов, и поэтому будут влиять на ваши предпочтения. Помимо синтаксиса, синтаксис merge! 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"}

Чтобы заставить оперативник << работать, я бы посоветовал ответить Mark Thomas.