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