我是Rust的新手,borrow checker 让我有些困惑。我不明白为什么这段代码无法编译。如果这个问题已经被回答过了,那么很抱歉,但我在其他问题中找不到解决方案。
我知道这与将本地字符串作为切片返回(&str)相似,但在那种情况下,只返回了一个字符串,对我来说不足以理解我正在尝试返回向量的代码。据我所知,我正在尝试返回指向函数块结束时将超出范围的
这是代码,错误在
我知道这与将本地字符串作为切片返回(&str)相似,但在那种情况下,只返回了一个字符串,对我来说不足以理解我正在尝试返回向量的代码。据我所知,我正在尝试返回指向函数块结束时将超出范围的
str
类型的引用,因此应该将那个&str
向量映射成一个String
向量吗?我不太关心将&str
转换为String
的性能影响。首先,我只是想让它工作起来。这是代码,错误在
lex
函数中。use std::io::prelude::*;
use std::fs::File;
use std::env;
fn open(mut s: &mut String, filename: &String) {
let mut f = match File::open(&filename) {
Err(_) => panic!("Couldn't open file"),
Ok(file) => file,
};
match f.read_to_string(&mut s) {
Err(_) => panic!("Couldn't read file"),
Ok(_) => println!("File read successfully"),
};
}
fn lex(s: &String) -> Vec<&str> {
let token_string: String = s.replace("(", " ( ")
.replace(")", " ) ");
let token_list: Vec<&str> = token_string.split_whitespace()
.collect();
token_list
}
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() < 2 {
panic!("Please provide a filename");
} else {
let ref filename = args[1];
let mut s = String::new();
open(&mut s, filename);
let token_list: Vec<&str> = lex(&s);
println!("{:?}", token_list);
}
}
这里是错误消息
error: borrowed value does not live long enough
self.0.borrow().values.get(idx)
^~~~~~~~~~~~~~~
reference must be valid for the anonymous lifetime #1 defined on the block at 23:54...
pub fn value(&self, idx: usize) -> Option<&Value> {
^
note: ...but borrowed value is only valid for the block at 23:54
pub fn value(&self, idx: usize) -> Option<&Value> {
^
我发现很难理解这段代码,因为我对Rust的经验有限,无法想象这些变量的生命周期。如果有帮助,将不胜感激,因为我已经花了一两个小时来尝试解决这个问题。
lex
函数中,你创建了一个新的String
,然后尝试返回该String
中的引用,即使那个String
并未超出lex
函数的生命周期,所以你的引用将指向无效的内存。 - oli_obklex
函数? - Alex G