blog.bouzuya.net

2022-12-27 Borrow と AsRef

気まぐれに Storage trait を書いてみた。

trait Storage { type Key; /* ... */ } としてみたところ、意外とうまく書けなくて Borrow と AsRef の話 (https://doc.rust-lang.org/1.30.0/book/first-edition/borrow-and-asref.html や https://doc.rust-lang.org/std/convert/trait.AsRef.html を参照) に至った。

String と str や PathBuf と Path を同一視したい状況で使える。 HashMap::get (https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get) が分かりやすい。

pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>where
    K: Borrow<Q>,
    Q: Hash + Eq,

K は HashMap<K, V> の K 。愚直にやると HashMap<String, T> の場合は map.get(&"key1".to_string()) しないといけない。 map.get("key1") したい。 この例だと K = String Q = str 。 impl Borrow<str> for String で impl<T> Borrow<T> for &T なので、 &str と &String に両対応できる。

……ところが、 PathBuf::join は Borrow じゃなく AsRef なことが問題で結局うまく実装できず、ひとまず諦めることにした。


今日のコミット。