Как я могу реализовать Borrow для варианта enum, чтобы использовать фрагмент строки в качестве ключа для HashMap?

В следующем сценарии:

#[derive(PartialEq, Eq, Hash)]
struct Key(String);

fn get_from_map(map: HashMap<Key, i32>, key: &str) {
    // ???
}

Я могу реализовать это с помощью трейта Borrow, поэтому мне не нужен &Key, достаточно &str:

impl Borrow<str> for Key {
    fn borrow(&self) -> &str {
        &self.0
    }
}

fn get_from_map(map: HashMap<Key, i32>, key: &str) {
    map.get(key);
}

Однако, когда мой ключ является перечислением, реализовать Borrow невозможно:

#[derive(PartialEq, Eq, Hash)]
enum Key {
    Text(String),
    Binary(Vec<u8>)
}

fn get_from_map(map: HashMap<Key, i32>, key: &str) {
    // ???
}

Есть ли эргономичный способ реализовать get_from_map, без клонирования key, чтобы он каким-то образом искал только Text ключи?

Мой первый инстинкт — внедрить Borrow для нового типа BorrowedKey, но это, похоже, не работает, поскольку Borrow нужно возвращать ссылку.


person rvidal    schedule 31.05.2018    source источник
comment
Что-то вроде это?   -  person Peter Hall    schedule 01.06.2018
comment
Вам нужна одна и та же реализация для работы с обоими типами ключей?   -  person Peter Hall    schedule 01.06.2018
comment
Я полагаю, что на ваш вопрос ответили ответы Как реализовать HashMap с двумя ключами?. См. также ответ на вопрос Как избежать временных выделений при использовании сложного ключа для HashMap?, который является той же логикой. Если вы не согласны, измените свой вопрос, чтобы объяснить различия. В противном случае мы можем пометить этот вопрос как уже отвеченный.   -  person Shepmaster    schedule 01.06.2018
comment
В вашей ситуации применяется дубликат.   -  person Shepmaster    schedule 01.06.2018
comment
@PeterHall Извините, я недостаточно конкретен. Я не собирался клонировать строку.   -  person rvidal    schedule 01.06.2018