使用`Hash #fetch`优于`Hash#[]`的好处

Edu*_*sta 20 ruby hash

我不确定在什么情况下我会想要使用Hash#fetchHash#[].是否有一个常见的场景,它会在哪些方面有用?

Mar*_*une 24

三个主要用途:

  1. 当值是必需的时,即没有默认值:

    options.fetch(:repeat).times{...}
    
    Run Code Online (Sandbox Code Playgroud)

    你也得到一个很好的错误信息:

    key not found: :repeat
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当值可以是nil或者false默认值是其他值时:

    if (doit = options.fetch(:repeat, 1))
      doit.times{...}
    else
      # options[:repeat] is set to nil or false, do something else maybe
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 当你不想使用default/ default_proc散列:

    options = Hash.new(42)
    options[:foo] || :default # => 42
    options.fetch(:foo, :default) # => :default
    
    Run Code Online (Sandbox Code Playgroud)


saw*_*awa 6

如果要在密钥不存在时获取默认值或引发错误,fetch则非常有用.如果没有fetch将默认值设置为哈希值,仍然可以这样做,但是使用fetch,您可以在现场进行.