2016-06-04 3 views
1

Есть ли способ сделать это? Это называется составным ключом?Ruby, Hash, Use Part A Composite Key

a = { ["key1", "key2"] => "stuff" } 
a[["key1",*]] 
+0

Там не определенный срок для этого в Ruby, так как ключ хеша может быть любой объект, поэтому массив или строка или что-нибудь лечится одинаково. – tadman

ответ

0

Нет, не существует. Вам понадобится линейный поиск всех ключей внутри хэша для тех, которые соответствуют вашим конкретным условиям.

Что вы на самом деле после того, как вложенной хэша:

a = { 
    key1: { 
    key2: "stuff" 
    } 
} 

a[:key1][:key2] # "stuff" 
a[:key1] # { key2: "stuff" } 
1

Там нет подстановочных интерпретаций, встроенных в Hash. Вы можете реализовать свой собственный с чем-то вроде:

class MyHash < Hash 
    def select_composite(key) 
    mkeys = matching_keys(key) 
    select { |k, _| mkeys.include?(k) } 
    end 

    private 

    def matching_keys(key) 
    keys.select { |hkey| matching_key?(hkey, key) } 
    end 

    def matching_key?(hkey, key) 
    elements = Array(key) 
    Array(hkey).each_with_index.select { |helement, i| 
     helement == elements[i] || elements[i] == '*' 
    }.count == elements.count 
    end 
end 

a = MyHash[{ %w(key1 key2) => "stuff" }] 
a.select_composite(%w(key1 *)) 
+0

Использование 'Array (key)' здесь довольно своеобразно. В чем смысл? Предполагая аргументы и ключи, Array не совсем не в порядке. – tadman