||fetch 都能实现设置默认值的需求, 但是稍有区别:

|| 实际上是先运算其左边的值, 如果是假的就做右边同时返回右边的值.

fetch 是针对Hash检测其key是否存在, 不存在才设置默认值.

这也就意味他们在Hash的值为 nilfalse 的时候, 效果会不同.

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