在迭代Vector时如何从& String中复制String?

时间:2017-07-24 08:12:26

标签: rust ownership

我试图了解所有权和借阅检查器。我遇到了一个我设法解决问题的问题。但我认为应该采用更符合人体工程学的方式来实现它。

以下代码会使借阅检查程序运行,因为我试图将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.filelistVec<ConfigFiles>,其中ConfigFiles为struct

我正在遍历filelist,我希望将ConfigFiles结构中的字段复制到新的Vec

如果我用那条替换那条线 let thisfile_path = String::from(&file.filepath); 它不起作用,因为&String没有实现特征转换。

我找到了解决方法,但我认为这不是理想的做法:

let thisfile_path = String::from(&file.filepath[..]);

这是解决这个问题的唯一方法吗?

2 个答案:

答案 0 :(得分:4)

std::string::String实现clone() method,因此您可以使用以下更直接的方式实现相同的目标:

let thisfile_path = file.filepath.clone();

答案 1 :(得分:2)

我现在无法尝试代码,而且我对Rust本身并不了解,但我认为.to_owned()正是您所寻找的。克隆引用会产生参考; .to_owned()返回所需的数据类型。