我试图了解所有权和借阅检查器。我遇到了一个我设法解决问题的问题。但我认为应该采用更符合人体工程学的方式来实现它。
以下代码会使借阅检查程序运行,因为我试图将file.filepath
移动到thisfile_path
,而它是在借用的上下文中。
for file in &self.filelist {
let thisfile_path = String::from(file.filepath);
let this_wd = self.notifier.add_watch(Path::new(&file.filepath), watch_mask::CLOSE_WRITE).unwrap();
let this_watch = Watchlist {configfile: thisfile_path, watchd: this_wd};
watches.push(this_watch);
}
&self.filelist
为Vec<ConfigFiles>
,其中ConfigFiles为struct
。
我正在遍历filelist
,我希望将ConfigFiles结构中的字段复制到新的Vec
。
如果我用那条替换那条线
let thisfile_path = String::from(&file.filepath);
它不起作用,因为&String
没有实现特征转换。
我找到了解决方法,但我认为这不是理想的做法:
let thisfile_path = String::from(&file.filepath[..]);
这是解决这个问题的唯一方法吗?
答案 0 :(得分:4)
std::string::String
实现clone()
method,因此您可以使用以下更直接的方式实现相同的目标:
let thisfile_path = file.filepath.clone();
答案 1 :(得分:2)
我现在无法尝试代码,而且我对Rust本身并不了解,但我认为.to_owned()
正是您所寻找的。克隆引用会产生参考; .to_owned()
返回所需的数据类型。