Edited at

AsRefトレイトについて

例えば新規ファイルを作成する関数は&str&Pathも引数にとることができる。

std::fs::File::create("/var/tmp/hoge");

std::fs::File::create(&std::path::Path("/var/tmp/fuga"));

何故ならこの関数の引数の型は&strでも&Pathでもなく、AsRef<Path>を実装するような型Pであり、


fs.rs

fn create<P: AsRef<Path>>(path: P) -> io::Result<File>


pathモジュールでstrPathに対してAsRef<Path>が実装されているので、


path.rs

impl AsRef<Path> for Path {

fn as_ref(&self) -> &Path {
self
}
}

impl AsRef<Path> for str {
fn as_ref(&self) -> &Path {
Path::new(self)
}
}


as_refメソッドで&Pathを取り出すことができる。

fn create<P: AsRef<Path>>(path: P) -> io::Result<File> {

let p: &Path = path.as_ref();
...
}