カスタムの型をHashMapのキーにする時のための Borrow<Borrowed> トレイト
Vec<u8>
をフィールドに持つ型Name
があるとする。
struct Name<Vec<u8>>
このName
をHashMap
のキーとする場合、毎回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() } }
関連
String
は、Borrow<str>
を実装Vec<T>
は、Borrow<[T]>` を実装