这似乎是一个非常简单的问题,但我从文档中没有得到任何线索。代码从&PathBuf创建PathBuf。我想知道是什么使这成为可能。文档中有一个实现,它从&String创建String。但是没有这样的PathBuf实现?幕后发生了什么?有什么工具/方法可以帮助我调试/调查?
&PathBuf
PathBuf
&String
String
fn main() { let a = std::path::PathBuf::from(""); let b = std::path::PathBuf::from(&a); }
krugob8w1#
转换通过OsStr进行。PathBuf具有impl AsRef<OsStr> for PathBuf实现和impl<T: AsRef<OsStr>> From<&T> for PathBuf实现顺便说一句,a也是这样工作的。PathBuf不实现From<&str>,但&str实现了AsRef<OsStr>。
OsStr
impl AsRef<OsStr> for PathBuf
impl<T: AsRef<OsStr>> From<&T> for PathBuf
a
From<&str>
&str
AsRef<OsStr>
gkl3eglg2#
从&T到拥有的T的方法是通过Clone特征,它是为PathBuf实现的:
&T
T
Clone
fn main() { let a = std::path::PathBuf::from(""); let b = a.clone(); }
2条答案
按热度按时间krugob8w1#
转换通过
OsStr
进行。PathBuf
具有impl AsRef<OsStr> for PathBuf
实现和impl<T: AsRef<OsStr>> From<&T> for PathBuf
实现顺便说一句,
a
也是这样工作的。PathBuf
不实现From<&str>
,但&str
实现了AsRef<OsStr>
。gkl3eglg2#
从
&T
到拥有的T
的方法是通过Clone
特征,它是为PathBuf
实现的: