Это меня давно беспокоило. Это не сложно, но я не знаю, почему уже нет простого способа сделать это, и я держу пари, что есть, и я не вижу этого.
Я просто хочу взять хеш, например:
cars = {:bob => 'Pontiac', :fred => 'Chrysler',
:lisa => 'Cadillac', :mary => 'Jaguar'}
и сделайте что-то вроде
cars[:bob, :lisa]
и получите
{:bob => 'Pontiac', :lisa => 'Cadillac'}
Я сделал это, и это прекрасно работает:
class Hash
def pick(*keys)
Hash[select { |k, v| keys.include?(k) }]
end
end
ruby-1.8.7-p249 :008 > cars.pick(:bob, :lisa)
=> {:bob=>"Pontiac", :lisa=>"Cadillac"}
Очевидно, что существует миллион простых способов сделать это, но мне интересно, есть ли что-то встроенное, что я пропустил, или хорошая неочевидная причина, это не стандартная и нормальная вещь? Без этого я использую что-то вроде:
chosen_cars = {:bob => cars[:bob], :lisa => cars[:lisa]}
что не конец света, но это не очень красиво. Кажется, это должно быть частью обычного словарного запаса. Что мне здесь не хватает?
(связанные вопросы включают в себя: Ruby Hash Whitelist Filter )
(этот пост в блоге имеет тот же результат, что и я, но опять же, почему он не встроен? http://matthewbass.com/2008/06/26/picking-values-from-ruby-hashes/)
Обновление:
Я использую Rails с ActiveSupport :: CoreExtensions :: Hash :: Slice, который работает именно так, как я хочу, поэтому проблема решена, но все же ... может, кто-то другой найдет здесь ответ :)