例えばAsRef<T>
トレイトを実装済のU
がある時、それから&T
を得られます。
このトレイトを実装している 1つにStruct std::path::Pathの::new
メソッドがあります。定義は以下の通り。
impl Path {
pub fn new + ?Sized>(s: &S) -> &Path {
// snap
}
}
戻って、::new
はAsRef<OsStr>
を持ったサイズ不定型s
を受け取ります。
ここでTrait std::convert::AsRef を見ると以下のような箇所があります。
impl AsRef for str
impl AsRef for String
よって&str
や&String
などはAsRef<OsStr> + ?Sized
を満たすのでこのような書き方で動きます。
use std::path::Path;
let str = "foo";
Path::new(str);
Path::new(&str.to_string());
似たものにBorrow
があります。AsRef
のようにU
から&T
を取得できるトレイトですが、得たT
に関してのHash
、Eq
、Ord
の結果が変換前と同じ結果になることが要求されます。
(この項目は違いがあまり違いが理解できてません🙇Borrow
はブランケット実装によってすべてのT
で自分を借りれる::borrow
を持っているので、「1番渡してほしいのはT
だけどU
でもいいよ、だけどU
は上記に対してT
と同じ結果を返すものにしてね」という場合はBorrow
、「手間だからT
になれるU
なら何でもいいよ」な場合はAsRef
かな的な🤔)