例えば新規ファイルを作成する関数は&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モジュールでstrやPathに対して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();
...
}