22

我不确定我想在什么情况下使用Hash#fetchover Hash#[]。是否有一个常见的场景可以很好地使用它?

4

3 回答 3

25

三个主要用途:

  1. 当该值是强制性的,即没有默认值时:

    options.fetch(:repeat).times{...}
    

    您也会收到一条很好的错误消息:

    key not found: :repeat
    
  2. 当值可以是nilorfalse并且默认值是其他值时:

    if (doit = options.fetch(:repeat, 1))
      doit.times{...}
    else
      # options[:repeat] is set to nil or false, do something else maybe
    end
    
  3. 当您不想使用哈希的default/时:default_proc

    options = Hash.new(42)
    options[:foo] || :default # => 42
    options.fetch(:foo, :default) # => :default
    
于 2013-01-30T01:43:49.887 回答
6

当您想获取默认值或在键不存在时引发错误时,fetch很有用。仍然可以fetch通过将默认值设置为哈希fetch来做到这一点,但是使用 ,您可以在现场完成。

于 2013-01-30T01:27:48.703 回答
0

但是,您可以这样做:

arr = [1,2,3]
arr[1..-2] #=> [1,2]

但不是这个:

arr.fetch(1..-2) #=> TypeError: no implicit conversion of Range into Integer

同样,您可以使用Hash#[]

arr[0] = "A"
arr #=> ["A",2,3]

但不是 fetch:

arr.fetch(0) = "A" #=> unexpected '=', expecting end-of-input
于 2017-05-04T23:26:02.283 回答