Как добавить к существующему хешу в Ruby

Что касается добавления пары key => value к существующему заполненному хешу в Ruby, я в процессе работы через Apress "Beginning Ruby" и только что закончил главу хэшей.

Я пытаюсь найти самый простой способ добиться тех же результатов с хэшами, что и с массивами:

x = [1, 2, 3, 4]
x << 5
p x

Ответ 1

Если у вас есть хэш, вы можете добавлять к нему элементы, ссылаясь на них клавишей:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

Здесь, как и [ ], создается пустой массив, { } создаст пустой хэш.

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

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

Важно помнить, что специфическая природа ключа хеша часто имеет значение:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails немного смущает, предоставляя HashWithIndifferentAccess, где он будет свободно конвертировать между методами адресации Symbol и String.

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

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Хеши могут быть преобразованы в массивы и наоборот:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

Когда дело доходит до "вставки" вещей в хэш, вы можете делать это по одному или использовать метод merge для объединения хэшей:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

Обратите внимание, что это не изменяет исходный хэш, но вместо этого возвращает новый. Если вы хотите объединить один хэш в другой, вы можете использовать метод merge!:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

Как и многие методы в String и Array, ! указывает, что это операция на месте.

Ответ 2

my_hash = {:a => 5}
my_hash[:key] = "value"

Ответ 3

Если вы хотите добавить более одного:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash

Ответ 4

x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

Ответ 5

hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

Вы можете получить свой ключ и значение с пользовательского ввода, поэтому вы можете использовать Ruby .to_sym, чтобы преобразовать строку в символ, а .to_i преобразует строку на целое число.
Например:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

Ответ 6

hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Возвращает объединенное значение.

hash
 => {:a=>"a", :b=>"b"} 

Но не изменяет объект вызывающего

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Переназначение делает свое дело.