Ruby Hash.merge только с указанными ключами - PullRequest
4 голосов
/ 26 мая 2010

Я почти уверен, что видел на сайте, связанном с Rails, что-то вроде:

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

И если один из ключей в require_keys не был указан, или если были ключи, которые не были указаны, возникла исключительная ситуация. Я просматривал ActiveSupport, и я думаю, что я мог бы искать что-то вроде обратного , за исключением .

Мне нравится стараться использовать как можно больше фреймворка по сравнению с написанием собственного кода, поэтому я спрашиваю, когда знаю, как создать такую ​​же функциональность самостоятельно. :)

В данный момент я делаю это с помощью обычной процедуры merge и проверяю, что у меня есть то, что мне нужно, с некоторыми IF.

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

Я думаю, что метод, о котором вы думаете, это assert_valid_keys ( документация здесь ), но это вызывает исключение, только если в хэше существуют непредвиденные ключи, а не если какой-либо из указанных ключей отсутствует , то есть, если для передачи опций методу используется хеш, его можно использовать для проверки недействительных опций, а не обязательных опций.

1 голос
/ 26 мая 2010

Вы можете сделать это самостоятельно относительно легко. Как было сказано в предыдущем ответе, половина вашей работы за вас сделана за 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...