如何修复'当在Rust中使用std::str::Chars时,`返回一个引用当前函数所拥有数据的值`

42fyovps  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个函数tk_from_file,它读取一个文件,并返回一个结构体Tokenizer,该结构体包含一个覆盖该文件内容的Peekable<Chars<'a>>
变量content来自于std::fs::read_to_string返回的Result<String>
但是,当我尝试创建该结构并返回它时,出现以下错误(E0515):

30 |           return Tokenizer {
   |  ________________^
31 | |             content: content.clone().chars().peekable(),
   | |                      --------------- temporary value created here
32 | |             loc: FileLocation {
33 | |                 file: path,
...  |
36 | |             }
37 | |         };
   | |_________^ returns a value referencing data owned by the current function

我尝试过在字符串迭代器上使用clone()clone(),但仍然不起作用。

cyvaqqii

cyvaqqii1#

在这个函数中创建的String被这个函数 * 拥有 *,因此你不能从这个函数返回任何对它的引用,因为当这个函数的堆栈帧被弹出时,String将被解除定位,你将有一个悬空指针,这在rust世界是一个很大的禁止。
如果你想引用这个在阅读文件时创建的String,你 * 必须 * 以某种方式从函数中返回拥有的String,并给予它的所有权给调用者。一个解决方案是在Tokenizer结构体中存储一个String,并在其上提供一个方法,该方法将借用一个String并返回迭代器。

struct Tokenizer {
    content: String,
    ...
}

impl Tokenizer {
    fn content(&self) -> Peekable<Chars<'_>> {
        self.content.chars().peekable()
    }
}

使用下面的结构,你可以将文件内容的所有权传递给调用者,并允许他们借用它,只要他们想。你可以在书的this章节中阅读更多关于所有权和借用的内容。

相关问题