如何在遍历向量时从&String复制字符串?

20

我正在努力理解所有权和借用检查器。我遇到了一个问题,虽然已经“解决”了,但我认为应该有一种更加人性化的解决方法。

下面的代码会触发借用检查器错误,因为我试图将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 是一个包含 ConfigFiles 结构体的 Vec<ConfigFiles>

我正在遍历 filelist,并想将 ConfigFiles 结构体中的一个字段复制到一个新的 Vec 中。

如果我将那行代码替换为 let thisfile_path = String::from(&file.filepath); 它不起作用,因为 &String 没有实现 convert 特性。

我已经找到了一种解决方法,但我认为这不是理想的方式:

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

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

2个回答

23

std::string::String实现了clone()方法,所以你可以使用以下更直接的方式来实现相同的功能:

let thisfile_path = file.filepath.clone();

6

我现在无法尝试这个代码,而且我自己对Rust并不是很了解,但我认为.to_owned()就是你要找的。克隆一个引用会产生一个引用;.to_owned()则返回所需的数据类型。


4
“克隆引用会生成一个引用,但仅当所引用的类型没有实现 Clone 接口时才是如此。” “我目前没有尝试这段代码的手段” — https://play.rust-lang.org/ - Shepmaster
1
我有一个类似的问题。个人而言,我更喜欢这个答案,因为我不想付出克隆字符串的代价。我想把字符串移到一个结构体中。移动字符串后,我就不再需要它了,因为我正在循环。 - Frederick Ollinger
2
@FrederickOllinger to_owned()不是克隆字符串吗? - Michael Dorst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接