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