关于在Ruby中的现有填充哈希中添加key => value
对,我正在通过Apress'Beginning Ruby工作并刚刚完成哈希章。
我正在尝试找到使用哈希实现相同结果的最简单方法,就像使用数组一样:
x = [1, 2, 3, 4]
x << 5
p x
答案 0 :(得分:179)
如果您有哈希,可以通过按键引用项目来添加项目:
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上的许多方法一样,!
表示它是就地操作。
答案 1 :(得分:63)
my_hash = {:a => 5}
my_hash[:key] = "value"
答案 2 :(得分:33)
如果您想添加多个:
hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash
答案 3 :(得分:8)
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x
答案 4 :(得分:1)
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"}
重新分配可以解决问题。
答案 5 :(得分:0)
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 :(得分:0)
您可以使用从Ruby 2.0开始可用的double splat运算符:
h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}