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 なことが問題で結局うまく実装できず、ひとまず諦めることにした。
今日のコミット。