如何修复字符串字段未实现“复制”?
How to fix String field does not implement `Copy`?
我正在用 Rust 构建一个简单的命令行待办事项应用程序。如果我不实现复制特征,我会得到这个错误:“移动发生是因为 'todo' 具有类型 'todo::Todo',它没有实现 'Copy' 特征”。当我尝试为我的 Todo 结构实现复制特征时,我收到以下错误:“字段文本:字符串未实现复制特征”。我该如何解决这个错误?我的代码如下:
pub type todo_type = Vec<Todo>;
#[derive(Copy)]
pub struct Todo {
id: usize,
text: String,
completed: bool,
}
impl Todo {
pub fn new(text: String, id: usize) -> Todo {
Todo {
text,
id,
completed: false,
}
}
}
pub struct Todos {
todos: todo_type,
}
impl Todos {
pub fn new(todos: todo_type) -> Todos {
Todos { todos }
}
pub fn get_all_todos(self) -> todo_type {
self.todos
}
pub fn get_single_todo(self, todo_index: usize) -> Todo {
unimplemented!()
}
pub fn add_todo(self, text: String) -> Todo {
let id: usize = 1;
if self.todos.len() == 0 {
let id = 1;
} else {
let last_todo = match self.todos.len() {
0 => None,
n => Some(&self.todos[n - 1]),
};
let id = last_todo.unwrap().id;
}
let todo = Todo::new(text, id);
self.todos.push(todo);
todo
}
pub fn remove_todo(self, todo_index: usize) -> bool {
self.todos.remove(todo_index);
true
}
}
这里你需要克隆特性而不是复制特性。 Copy 特性表示变量可以按原样逐位复制,并且这种类型的变量不支持移动语义。
一些限制适用于复制特征的实现。就是这样,只有 none 的组件实现了 Drop 特性,结构才能实现 Copy 特性。由于 String 实现了 Drop 特性,因此您的结构无法实现 Copy。
如果您希望复制您的结构,那么您需要克隆特性。
我正在用 Rust 构建一个简单的命令行待办事项应用程序。如果我不实现复制特征,我会得到这个错误:“移动发生是因为 'todo' 具有类型 'todo::Todo',它没有实现 'Copy' 特征”。当我尝试为我的 Todo 结构实现复制特征时,我收到以下错误:“字段文本:字符串未实现复制特征”。我该如何解决这个错误?我的代码如下:
pub type todo_type = Vec<Todo>;
#[derive(Copy)]
pub struct Todo {
id: usize,
text: String,
completed: bool,
}
impl Todo {
pub fn new(text: String, id: usize) -> Todo {
Todo {
text,
id,
completed: false,
}
}
}
pub struct Todos {
todos: todo_type,
}
impl Todos {
pub fn new(todos: todo_type) -> Todos {
Todos { todos }
}
pub fn get_all_todos(self) -> todo_type {
self.todos
}
pub fn get_single_todo(self, todo_index: usize) -> Todo {
unimplemented!()
}
pub fn add_todo(self, text: String) -> Todo {
let id: usize = 1;
if self.todos.len() == 0 {
let id = 1;
} else {
let last_todo = match self.todos.len() {
0 => None,
n => Some(&self.todos[n - 1]),
};
let id = last_todo.unwrap().id;
}
let todo = Todo::new(text, id);
self.todos.push(todo);
todo
}
pub fn remove_todo(self, todo_index: usize) -> bool {
self.todos.remove(todo_index);
true
}
}
这里你需要克隆特性而不是复制特性。 Copy 特性表示变量可以按原样逐位复制,并且这种类型的变量不支持移动语义。
一些限制适用于复制特征的实现。就是这样,只有 none 的组件实现了 Drop 特性,结构才能实现 Copy 特性。由于 String 实现了 Drop 特性,因此您的结构无法实现 Copy。
如果您希望复制您的结构,那么您需要克隆特性。