Есть ли способ сделать это? Это называется составным ключом?Ruby, Hash, Use Part A Composite Key
a = { ["key1", "key2"] => "stuff" }
a[["key1",*]]
Есть ли способ сделать это? Это называется составным ключом?Ruby, Hash, Use Part A Composite Key
a = { ["key1", "key2"] => "stuff" }
a[["key1",*]]
Нет, не существует. Вам понадобится линейный поиск всех ключей внутри хэша для тех, которые соответствуют вашим конкретным условиям.
Что вы на самом деле после того, как вложенной хэша:
a = {
key1: {
key2: "stuff"
}
}
a[:key1][:key2] # "stuff"
a[:key1] # { key2: "stuff" }
Там нет подстановочных интерпретаций, встроенных в 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 *))
Использование 'Array (key)' здесь довольно своеобразно. В чем смысл? Предполагая аргументы и ключи, Array не совсем не в порядке. – tadman
Там не определенный срок для этого в Ruby, так как ключ хеша может быть любой объект, поэтому массив или строка или что-нибудь лечится одинаково. – tadman