例えば新規ファイルを作成する関数は&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();
...
}