カスタムの型をHashMapのキーにする時のための Borrow<Borrowed> トレイト

Vec<u8> をフィールドに持つ型Nameがあるとする。

struct Name<Vec<u8>>

このNameHashMapのキーとする場合、毎回Vecから生成する必要がこのままでは発生する。

fn get(&self, key: &[u8]) -> &String {
    let name = Name(key.to_vec());
    self.0.get(&name).unwrap()
}

これを回避するには、Nameに対し、Borrow<Borrowed>トレイトを実装する。

impl Borrow<[u8]> for Name {
    fn borrow(&self) -> &[u8] {
        &*self.0
    }
}

これによって、Vec<u8>を生成することなく値を取り出すことが

struct Dict(HashMap<Name, String>);
impl Dict {
    fn new() -> Self {
        Dict(HashMap::new())
    }
    fn set(&mut self, key: Name, value: String) {
        self.0.insert(key, value);
    }
    fn get(&self, key: &[u8]) -> &String {
        self.0.get(key).unwrap()
    }
}

関連

yossan.hatenablog.com

Stringは、Borrow<str>を実装 Vec<T>は、Borrow<[T]>` を実装