散列类值的获取与设定
h = Hash.new
h.store("R", "Ruby")
p h.fetch("R") #=> "Ruby"
使用 fetch 方法时,有一点与 [] 不一样,就是如果散列中不存在指定的键,程序就会发生异常。
h = Hash.new
p h.fetch("N") #=> 错误(KeyError)
如果对 fetch 方法指定第2 个参数,那么该参数值就会作为键不存在时的返回值。
h = Hash.new
h.store("R", "Ruby")
p h.fetch("R", "(undef)") #=> "Ruby"
p h.fetch("N", "(undef)") #=> "(undef)"
此外, fetch 方法还可以使用块,此时块的执行结果为键不存在时的返回值。
h = Hash.new
p h.fetch("N"){ String.new } #=> ""
一次性获取所有的键、值
h = {"a"=>"b", "c"=>"d"}
p h.keys #=> ["a", "c"]
p h.values #=> ["b", "d"]
p h.to_a #=> [["a", "b"], ["c", "d"]]
指定生成散列默认值的块
h = Hash.new do |hash, key|
hash[key] = key.upcase
end
h["a"] = "b"
p h["a"] #=> "b"
p h["x"] #=> "X"
p h["y"] #=> "Y"
散列方法
h = { "a" => 100, "b" => 200 }
h.each_key {|key| puts key }
a
b
- h.key?(key)
h.has_key?(key)
h.include?(key)
h.member?(key) - h.value?(value)
h.has_value?(value) - h.size
h.length - h.empty?
- h.delete(key)
- h.delete_if{|key, val| ... }
h.reject!{|key, val| ... }
delete_if 方法返回的是原来的散列,而 reject! 方法返回的则是 nil。 - h.clear
可以用 clear 方法清空使用过的散列。
【例 1】
h = {"k1"=>"v1"}
g = h
h.clear
p g #=> {}
【例 2】
h = {"k1"=>"v1"}
g = h
h = Hash.new
p g #=> {"k1"=>"v1"}
- 使用Hash#merge 方法可以合并两个散列,创建一个新的散列。Hash#merge! 是 Hash#merge 对应的具有破坏性的方法,它会更新作为接收者的散列。Hash#merge! 还有一个别名叫 Hash#update,两者的用法相同。
p ({"a"=>"x"}.merge({"b"=>"y"})) #=> {"a"=>"x", "b"=>"y"}