从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的原始值;