我有一个函数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()
,但仍然不起作用。
1条答案
按热度按时间cyvaqqii1#
在这个函数中创建的
String
被这个函数 * 拥有 *,因此你不能从这个函数返回任何对它的引用,因为当这个函数的堆栈帧被弹出时,String
将被解除定位,你将有一个悬空指针,这在rust世界是一个很大的禁止。如果你想引用这个在阅读文件时创建的
String
,你 * 必须 * 以某种方式从函数中返回拥有的String
,并给予它的所有权给调用者。一个解决方案是在Tokenizer
结构体中存储一个String
,并在其上提供一个方法,该方法将借用一个String
并返回迭代器。使用下面的结构,你可以将文件内容的所有权传递给调用者,并允许他们借用它,只要他们想。你可以在书的this章节中阅读更多关于所有权和借用的内容。