Hash类
散列的创建
使用{}
h1 = {"a"=>"b", "c"=>"d"}
#符号
#h2 = {:a=>"b", :c=>"d"}
h2 = {a: "b", c: "d"}
使用Hash.new
h1 = Hash.new
h1[:a] = "b"
h1[:c] = "d"
值得获取与设定
h = {}
h["R"] = Ruby
p h["R"]
h = {}
p h["R"]
#=> nil
p h.fetch("R")
#=> 异常报错
p h.fetch("R", "Ruby")
#=> "Ruby"
p h.fetch("R") { String.new }
#=> ""
p h
#=> {}
一次获取所有的键、值
数组形式 | 迭代器形式 | |
---|---|---|
获取键 | keys | each_key{ |键| ...} |
获取值 | values | each_value{ |值| ...} |
获取键值对[键, 值] | to_a | each{ |键, 值| ...} each{ |数组| ...} |
h = {"a"=>"b", "c"=>"d"}
p h.keys
#=> ["a", "c"]
p h.values
#=> ["b", "d"]
p h.to_a
#=> [["a", "b"], ["c", "d"]]
散列的默认值
Hash.new指定默认值
h = Hash.new(1)
h["a"] = 10
p h["a"]
#=> 10
p h["x"]
#=> 1
p h["y"]
#=> 1
通过块指定默认值
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"
通过fetch指定
优先级最高
h = Hash.new do |hash, key|
hash[key] = key.upcase
end
p h.fetch("x", "(undef)")
#=> "(undef)"
查看指定对象是否为散列的键或者值
h.key?(key)
h.has_key?(key)
h.include?(key)
h.member?(key)
查看指定对象是否为散列的键。这4个方法用法和作用一模一样
h = {"a"=>"b", "c"=>"d"}
p h.key?("a")
#=> true
p h.has_key?("a")
#=> true
p h.include?("z")
#=> false
p h.member?("z")
#=> false
h.value?(value)
h.has_value?(value)
查看散列的值中是否存在指定对象
h = {"a"=>"b", "c"=>"d"}
p h.value?("b")
#=> true
p h.has_value?("b")
#=> false
查看散列的大小
h.size
h.length
h = {"a"=>"b", "c"=>"d"}
p h.length
p h.size
删除键值
h.delete(key)
h = {"R" => "Ruby"}
h.delete("R")
p h["R"]
#=> nil
h = {"R" => "Ruby"}
#如果指定不存在的键,返回块执行的结果
p h.delete("P"){|key| "no #{key}."}
#=> "no P."
h.delete_if{|key, val|...}
h.reject!{|key, val|...}
h = {"R"=>"Ruby", "P"=>"PHP"}
#按指定条件删除
p h.delete_if{|key, value| key == "P"}
#=> {"R"=>"RUBY"} 返回删除的hash
h = {"R"=>"Ruby", "P"=>"PHP"}
#当不符合删除条件时,返回值不一样
p h.reject!{|key, value| key == "L"}
#=> {"R"=>"Ruby", "P"=>"PHP"} 返回原hash
p h.reject!{|key, value| key == "L"}
#=> nil 返回nil
初始化hash
h = {"k1"=>"v1"}
g = h
h.clear
p g
#=> {}
h = {"k1"=>"v1"}
g = h
h = Hash.new
p g
#=> {"k1"=>"v1"}
hash的键
h = Hash.new
n1 = 1 #Fixnum
n2 = 1.0 #Float
p n1 == n2
#=> true
h[n1] = "exists."
p h1[1]
#=> "exists."
p h[n1]
#=> "exists."
#因为一个是Fixnum一个是Flaot,是不同类的对象,所以不行
p h[n2]
#=> nil