Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何修复字符串字段未实现“复制”?_Rust_Borrowing - Fatal编程技术网

Rust 如何修复字符串字段未实现“复制”?

Rust 如何修复字符串字段未实现“复制”?,rust,borrowing,Rust,Borrowing,我正在Rust中构建一个简单的命令行todo应用程序。如果我没有实现复制特性,我会得到以下错误:“移动发生的原因是'todo'的类型为'todo::todo',它没有实现'copy'特性”。当我尝试实现Todo结构的复制特性时,我收到以下错误:“字段文本:字符串未实现复制特性”。如何修复此错误?我的代码如下: pub-type-todo\u-type=Vec; #[来源(副本)] 发布结构待办事项{ id:使用, 文本:字符串, 完成:布尔, } 执行待办事项{ pub fn new(文本:St

我正在Rust中构建一个简单的命令行todo应用程序。如果我没有实现复制特性,我会得到以下错误:“移动发生的原因是'todo'的类型为'todo::todo',它没有实现'copy'特性”。当我尝试实现Todo结构的复制特性时,我收到以下错误:“字段文本:字符串未实现复制特性”。如何修复此错误?我的代码如下:

pub-type-todo\u-type=Vec;
#[来源(副本)]
发布结构待办事项{
id:使用,
文本:字符串,
完成:布尔,
}
执行待办事项{
pub fn new(文本:String,id:usize)->Todo{
待办事项{
文本,
身份证件
已完成:错误,
}
}
}
pub结构Todos{
待办事项:待办事项类型,
}
执行待办事项{
新发布(待办事项:待办事项类型)->待办事项{
Todos{Todos}
}
发布fn获取所有待办事项(self)->待办事项类型{
自述待办事项
}
pub fn get_single_todo(self,todo_index:usize)->todo{
未执行!()
}
pub fn add_todo(self,text:String)->todo{
让id:usize=1;
如果self.todos.len()=0{
设id=1;
}否则{
让last_todo=匹配self.todos.len(){
0=>无,
n=>Some(&self.todos[n-1]),
};
让id=last_todo.unwrap().id;
}
让todo=todo::new(文本,id);
self.todos.push(todo);
待办事项
}
pub fn remove_todo(self,todo_index:usize)->bool{
self.todos.remove(todo_索引);
真的
}
}

这里您需要克隆特征而不是复制特征。Copy特性表明变量可以按原样逐位复制,并且这种类型的变量不作为移动语义的基础

一些限制适用于Copy-trait的实现。因此,只有当结构的所有组件都没有实现Drop特性时,结构才能实现复制特性。由于String实现了Drop特性,因此您的结构无法实现副本


如果你想复制你的结构,那么你需要克隆特征。

总之,你不能(也不应该)为你的结构实现复制——这意味着按位复制。相反,您应该通过添加
#[派生(克隆)]
来派生
Clone
,这将使您的结构提供
Clone()
函数。我实现了克隆,但随后出现了其他错误:不能作为可变项借用,移动后此处使用的值,不能作为可变项借用。这意味着您可能必须重新考虑代码设计。例如,为什么需要
add_todo
返回
todo
,为什么需要
todo
消费
self
?我想我不需要返回
todo
。你知道如何解决这个错误吗:
不能借用
self。todos`as mutable,因为
self
没有声明为mutable`?我用
mut self
替换了
self
来修复它