bouzuya.hatenablog.com

ぼうずやのにっき

Borrow と AsRef

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

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

StringstrPathBufPath を同一視したい状況で使える。 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,

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

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


今日のコミット。