Rust 为什么我会得到这个错误;不能多次借用x作为可变项";?
我正在Rust中实现一个解析器。我必须更新前瞻的索引,但是在Rust 为什么我会得到这个错误;不能多次借用x作为可变项";?,rust,lifetime,Rust,Lifetime,我正在Rust中实现一个解析器。我必须更新前瞻的索引,但是在self.current()之后调用self.get()时,我会得到一个错误: cannot borrow *self as mutable more than once at a time 这让人困惑,因为我是新手 #[derive(Debug)] pub enum Token { Random(String), Undefined(String), } struct Point { token: Vec&
self.current()
之后调用self.get()
时,我会得到一个错误:
cannot borrow *self as mutable more than once at a time
这让人困惑,因为我是新手
#[derive(Debug)]
pub enum Token {
Random(String),
Undefined(String),
}
struct Point {
token: Vec<Token>,
look: usize,
}
impl Point {
pub fn init(&mut self){
while let Some(token) = self.current(){
println!("{:?}", token);
let _ = self.get();
}
}
pub fn current(&mut self) -> Option<&Token> {
self.token.get(self.look)
}
pub fn get(&mut self) -> Option<&Token> {
let v = self.token.get(self.look);
self.look += 1;
v
}
}
fn main(){
let token_list = vec![Token::Undefined("test".to_string()),
Token::Random("test".to_string())];
let mut o = Point{ token: token_list, look: 0 };
o.init();
}
#[派生(调试)]
发布枚举令牌{
随机(字符串),
未定义(字符串),
}
结构点{
令牌:Vec,
看:用,
}
内点{
发布fn初始(&M自我){
而让一些(令牌)=self.current(){
println!(“{:?}”,标记);
让u=self.get();
}
}
发布fn当前(&mut self)->选项{
self.token.get(self.look)
}
pub fn get(&mut self)->选项{
设v=self.token.get(self.look);
self.look+=1;
v
}
}
fn main(){
让token_list=vec![token::Undefined(“test.”to_string()),
令牌::随机(“test.to_string())];
设muto=Point{token:token_list,look:0};
o、 init();
}
函数Point::get
对调用它的点进行变异。函数Point::current
返回对调用它的点的一部分的引用。所以,当你写作的时候
while let Some(token) = self.current() {
println!("{:?}", token);
let _ = self.get();
}
token
是对self
中存储的内容的引用。由于变异self
可能会更改或删除token
指向的任何对象,因此当变量token
在作用域内时,编译器会阻止您调用self.get()
。函数Point::get
变异调用它的点。函数Point::current
返回对调用它的点的一部分的引用。所以,当你写作的时候
while let Some(token) = self.current() {
println!("{:?}", token);
let _ = self.get();
}
token
是对self
中存储的内容的引用。由于变异self
可能会更改或删除token
指向的任何内容,因此当变量token
在作用域内时,编译器会阻止您调用self.get()
。@Adrian已经给出了编译器发出错误消息的正确原因。如果将变异表达式绑定到一个作用域内,然后在作用域完成后调用self.get
,则可以编译程序。
代码可以修改为
loop{
{
let t = if let Some(token) = self.current(){
token
}else{
break
};
println!("{:?}", t);
}
let b = self.get();
println!("{:?}", b);
}
@Adrian已经给出了编译器发出错误消息的正确原因。如果将变异表达式绑定到一个作用域内,然后在作用域完成后调用self.get
,则可以编译程序。
代码可以修改为
loop{
{
let t = if let Some(token) = self.current(){
token
}else{
break
};
println!("{:?}", t);
}
let b = self.get();
println!("{:?}", b);
}
在rust中做这样的事情的正确方法是什么?@上帝重组你的代码,这样你就不会保留对正在变异的事物的引用在rust中做这样的事情的正确方法是什么?@上帝重组你的代码,这样你就不会保留对正在变异的事物的引用