Ruby Hash.merge只有指定的键

时间:2010-05-26 08:08:13

标签: ruby-on-rails ruby hash

我很确定我在Rails相关网站上看到了以下内容:

def my_function(*opts)
  opts.require_keys(:first, :second, :third)
end

如果未指定require_keys中的某个键,或者如果没有指定键,则会引发异常。我一直在寻找ActiveSupport,我想我可能正在寻找类似于except的倒数的东西。

与编写自己的代码相比,我喜欢尝试使用尽可能多的框架,这就是我在知道如何自己创建相同功能时的原因。 :)

目前,我正在通过正常的merge例行程序,并确保我拥有一些IF所需的内容。

2 个答案:

答案 0 :(得分:2)

我认为您考虑的方法是assert_valid_keysdocumentation here)但是如果哈希中存在任何意外密钥,则只会引发异常,而不会丢失任何指定的密钥。即如果正在使用散列将选项传递给方法,则可以使用散列检查无效选项而不是所需选项。

答案 1 :(得分:1)

您可以相对轻松地自己完成此操作。正如之前的回答中所述,assert_valid_keys中已完成一半的工作。您可以使用自己的方法来完成剩下的工作。

def my_function( *opts )
  opts.require_and_assert_keys( :first, :second, :third )
end

使用以下内容创建lib/hash_extensions.rb

class Hash
  def require_and_assert_keys( *required_keys )
    assert_valid_keys( keys )
    missing_keys = required_keys.inject(missing=[]) do |missing, key|
      has_key?( key ) ? missing : missing.push( key )
    end
    raise( ArgumentError, "Missing key(s): #{missing_keys.join( ", ")}" ) unless missing_keys.empty?
  end
end

最后,在config/environment.rb中添加以使其正常工作:

require 'hash_extensions'