Reference 无法移出借用内容/无法移出共享引用后面

Reference 无法移出借用内容/无法移出共享引用后面,reference,rust,move-semantics,borrow-checker,Reference,Rust,Move Semantics,Borrow Checker,我不理解错误无法移出借用的内容。我已经收到过很多次了,我一直都在解决它,但我一直不明白为什么 例如: for line in self.xslg_file.iter() { self.buffer.clear(); for current_char in line.into_bytes().iter() { self.buffer.push(*current_char as char); } println!("{}", line); } 产

我不理解错误
无法移出借用的内容
。我已经收到过很多次了,我一直都在解决它,但我一直不明白为什么

例如:

for line in self.xslg_file.iter() {
    self.buffer.clear();

    for current_char in line.into_bytes().iter() {
        self.buffer.push(*current_char as char);
    }

    println!("{}", line);
}
产生错误:

错误[E0507]:无法移出借用的内容
-->src/main.rs:31:33
|
31 |对于行中的当前_字符,转换为_字节().iter(){
|^^^^无法移出借用的内容
在更新版本的Rust中,错误是

error[E0507]:无法移出共享引用后面的“*行”
-->src/main.rs:31:33
|
31 |对于行中的当前_字符,转换为_字节().iter(){
|^^^^之所以发生移动,是因为“*line”的类型为“std::string::string”,它没有实现“Copy”特性
我通过克隆
解决了这个问题:

for current_char in line.clone().into_bytes().iter() {
即使阅读了其他帖子,我也不理解这个错误,比如:


这类错误的根源是什么?

让我们看看签名:


你看过了吗?(顺便说一句,字符串提供了
.bytes()
方法。)是的,我看过了,但不明白:(我的字符串是std::string::string,根据文档,没有.bytes()方法它被称为
。as_bytes()
事实上,谢谢你,它与
as_bytes()一起工作)
没有克隆。但我仍然不明白为什么?
String
str
获取方法。
fn into_bytes(self) -> Vec<u8>
struct IteratorOfStringReference<'a>(&'a String);

impl<'a> Iterator for IteratorOfStringReference<'a> {
    type Item = &'a String;

    fn next(&mut self) -> Option<Self::Item> {
        None
    }
}

struct FileLikeThing {
    string: String,
}

impl FileLikeThing {
    fn iter(&self) -> IteratorOfStringReference {
        IteratorOfStringReference(&self.string)
    }
}

struct Dummy {
    xslg_file: FileLikeThing,
    buffer: String,
}

impl Dummy {
    fn dummy(&mut self) {
        for line in self.xslg_file.iter() {
            self.buffer.clear();

            for current_char in line.into_bytes().iter() {
                self.buffer.push(*current_char as char);
            }

            println!("{}", line);
        }
    }
}

fn main() {}