Pointers 无法移出取消引用(由于索引,取消引用是隐式的)
我目前正在学习生锈和编写简单的游戏。但是有一个错误。枚举中有一个字符向量,当试图在向量的某个索引处返回值时,编译器会显示以下错误Pointers 无法移出取消引用(由于索引,取消引用是隐式的),pointers,compiler-errors,rust,Pointers,Compiler Errors,Rust,我目前正在学习生锈和编写简单的游戏。但是有一个错误。枚举中有一个字符向量,当试图在向量的某个索引处返回值时,编译器会显示以下错误 rustc main.rs field.rs:29:9: 29:39 error: cannot move out of dereference (dereference is implicit, due to indexing) field.rs:29 self.clone().field[index - 1u] as
rustc main.rs
field.rs:29:9: 29:39 error: cannot move out of dereference
(dereference is implicit, due to indexing)
field.rs:29 self.clone().field[index - 1u] as int
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
main.rs:
mod field;
fn main() {
let mut field = field::Field::new(3u);
field.change_cell(1, field::Character::X);
println!("{}", field.get_cell(1));
}
field.rs:
pub enum Character {
NONE, X, O,
}
pub struct Field {
field: Vec<Character>,
size: uint,
cells: uint,
}
impl Field {
pub fn new(new_size: uint) -> Field {
Field {
field: Vec::with_capacity(new_size*new_size),
size: new_size,
cells: new_size*new_size,
}
}
pub fn change_cell(&mut self, cell_number: uint, new_value: Character) -> bool {
...
}
pub fn get_cell(&self, index: uint) -> int {
self.field[index - 1u] as int
}
}
以下是解决您问题的MCVE:
enum Character {
NONE, X, O,
}
fn main() {
let field = vec![Character::X, Character::O];
let c = field[0];
}
编译此文件时会出现以下错误:
error: cannot move out of dereference (dereference is implicit, due to indexing)
let c = field[0];
^~~~~~~~
note: attempting to move value to here
let c = field[0];
^
to prevent the move, use `ref c` or `ref mut c` to capture value by reference
let c = field[0];
^
问题是,当您使用索引时,您调用的是将引用返回到向量中的。此外,还有一种语法可以隐式地取消引用该值。这是一件好事,因为人们通常不期望结果是引用
当您将该值分配给另一个变量时,您会遇到麻烦。在Rust中,你不能随意复制东西,你必须将物品标记为可复制。这告诉Rust,对该项目进行逐位复制是安全的:
#[derive(Copy,Clone)]
enum Character {
NONE, X, O,
}
这允许MCVE进行编译
如果您的项目不可复制怎么办?那么,只有引用您的值才安全:
let c = &field[0];
欢迎来到堆栈溢出!在将来,您应该尝试创建一个新的。这有助于我们更快地回答您的问题,并可能帮助您自己解决问题!