Ruby样式:哈希的默认值

时间:2013-07-02 22:38:10

标签: ruby

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

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

或:

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

因为我想在提取值时从哈希中删除键。

2 个答案:

答案 0 :(得分:3)

我认为您可以将fetch与默认选项一起使用。

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

修改

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

但是,第二种选择在眼睛上更容易。

答案 1 :(得分:2)

关键字参数:

如果您使用的是Ruby 2.0或更高版本,最常用的方法是使用keyword arguments

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

使用fetch可能比使用opts[:bar] || 10更好,因为它允许方法的调用者指定bar=nilbar=false。如果{0}}运算符为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