4

鉴于我有一个可能缺少键的选项哈希,什么被认为是更好或更惯用的 Ruby?这个:

my_val = opts.delete(:key){|k| default_value_for_key }

或者:

my_val = opts.delete(:key) || default_value_for_key

鉴于我想在提取值时从哈希中删除键。

4

2 回答 2

3

我认为您可以使用fetch默认选项。

my_val = opts.fetch(:key, "default_value_for_key")

编辑:

鉴于您要删除密钥,块形式是恕我直言的方式,因为它将返回块评估的任何内容。

但是,第二种选择对眼睛来说更容易。

于 2013-07-02T22:40:50.423 回答
2

关键字参数:

如果您使用的是 Ruby 2.0 或更高版本,最惯用的做法是使用关键字参数

def foo(bar: 10)
  # do something with bar
end

关键字参数功能自动负责分配默认值并在提供未知键时引发异常。

如果您没有使用 Ruby 2.0,或者关键字参数由于其他原因不起作用,您应该决定您的方法是否会检测到未知键并抛出错误,或者只是默默地忽略它们。

默默地忽略未知键:

def foo(opts={})
  bar = opts.fetch(:bar, 10)
  # do something with bar
end

usingfetch可能比 using 更好,opts[:bar] || 10因为它允许方法的调用者指定bar=nilor bar=false。该||运算符将导致您覆盖从哈希返回的任何值,如果它是 nil 或 false。

抱怨未知键:

如果您有很多键并且想在给出未知键时抛出异常,您可能应该使用delete. 这里的想法是,当您完成删除已知键时,只剩下未知键。

def foo(opts={})
  opts = opts.dup   # Avoid deleting from the hash the caller passed
                    # in because that would surprise the caller!

  bar = opts.delete(:bar) { 10 }
  # get other options

  raise "Unknown keys #{opts.keys.inspect}" if !opts.empty?

  # do stuff
end
于 2013-07-02T22:54:38.403 回答