前言
这一章节介绍了 Ruby 中 hash 这一数据类型的用法和特征.
Hash 的定义
与 array 的对比
最大的不同:
An array can only use integers as indexes, but a hash can use any object as a key.
其他不同点:
- array 用 [] 包括起来, hash 用 { } 包括起来.(但是 specify 的时候都是通过 [[)
- array 查找某一个元素需要遍历, hash 查找一个元素是通过 key 的
Hash return "nil" by default
解释: 在 specify 的时候,如果键不存在,那么返回的值为 nil.
Ruby 中的 nil
在 Ruby 中,与其他语言不同, nil and only nil is "falsy"
解决办法
格式: votes = Hash.new(0)
功能:通过 create a new hash with a default object of "0" 的方式,当我们想要 access 一个不存在的 key 所对应的 value 的时候,默认返回值为 0.
Hash 的 each 方法
格式:
votes.each do |name, count|
puts "#{name} : #{count}"
end
注意:
与 array 中的 each 方法的功能相同,但是需要两个参数.
Hash 作为 method 的 parameter
method 调用普通 parameter 与 hash 的对比
不同之处:
- 对于 parameter 来说, arguments 必须 in exactly the right order; 对于 hash 来说,这不是必要的
- 对于 parameter 来说, required parameters have to appear before optional parameters, 对于 hash 来说, 你可以 skip 任何一个 key that you want.
- 对于 parameter 来说,很难区别参数之间, 对于 hash 来说,可以通过 key 来得知 value 代表了什么
Hash 的简化
简化方式一: Leave off the braces
在调用 method 的时候,可以去掉 "{ }"
格式:
candidate = Candidate.new("Carl Barnes", :age => 49, :occupation => "Attorney")
简化方式二: Leave out the arrows
在输入 Hash 的时候, 可以用 key: value 的格式
Required keyword arguments
格式:
def initialize(name, age: nil, occupation: nil, hobby: nil, birthplace: "Sleepy Creek")
功能:
Hash 作为 method 的参数的时候, 如果存在 typo 的时候,Ruby 不会报错,因此是一种 silent failures, 可以通过 required keyword 来避免.
与一般 parameter 的区别
如果在 : 后面没有值,它和一般的 parameter 功能相同
如果在 : 后面有值,它和 parameter = default value 的功能相同