从Hash取值时设置默认值
|| 和 fetch 都能实现设置默认值的需求, 但是稍有区别:
|| 实际上是先运算其左边的值, 如果是假的就做右边同时返回右边的值.
fetch 是针对Hash检测其key是否存在, 不存在才设置默认值.
这也就意味他们在Hash的值为 nil 和 false 的时候, 效果会不同.
arg = {
a: 'string',
b: nil,
c: 0,
}
keys = arg.keys + [:xyz]
keys.each do |key|
value1 = arg[key] || '[] init'
value2 = arg.fetch(key, 'fetch init')
puts "#{key}\t\t#{value1}\t\t#{value2}"
end
=begin
a string string
b [] init
c 0 0
xyz [] init fetch init
=end
Hash#fetch
h.fetch(:key) 当key不存在的时候会抛异常 KeyError;
h.fetch(:key, 'your default'), 当key不存在的时候返回 your default;
h.fetch(:xyz) { |key| "this is your #{key}" }, 当key不存在时, 返回block的值, 当key存在时返回key的原始值;