Function “我该如何解决?”;方法“克隆”存在,但未满足以下特征界限;克隆带有泛型和函数指针的结构时?
我正在编写一个函数,它将在终端中创建一个菜单界面。要使用该函数,需要向其传递一个Function “我该如何解决?”;方法“克隆”存在,但未满足以下特征界限;克隆带有泛型和函数指针的结构时?,function,pointers,rust,clone,Function,Pointers,Rust,Clone,我正在编写一个函数,它将在终端中创建一个菜单界面。要使用该函数,需要向其传递一个Vec 错误[E0599]:没有为struct`menu\u选项找到名为`clone`的方法{ | ----------------------------- | | |找不到此方法的“克隆” |不满足“菜单”选项` | =注意:方法“clone”存在,但未满足以下特征界限: `&mut i32:std::clone::clone` 当您在菜单选项和菜单选项操作上自己实现克隆时,`menu\u option需要它。默
Vec
错误[E0599]:没有为struct`menu\u选项找到名为`clone`的方法{
| -----------------------------
| |
|找不到此方法的“克隆”
|不满足“菜单”选项`
|
=注意:方法“clone”存在,但未满足以下特征界限:
`&mut i32:std::clone::clone`
当您在菜单选项
和菜单选项
操作
上自己实现克隆
时,`menu\u option需要它。默认情况下,由于您的结构/枚举有一个类型参数,的宏扩展是[derive(Clone)]
属性将限制您的类型的克隆实现为T:clone
在您的情况下,不仅不需要此要求,而且它也不太可能得到遵守(例如,&mut T T
不实现Clone
)。通过手动实现Clone
,您可以摆脱T:Clone
要求,它可以工作
请注意,函数指针实现Copy
,这就是菜单选项\u action::callback(*f)
工作的原因:
type StateType = i32;
pub struct menu_option<'a, T> {
pub command: &'a str,
pub description: &'a str,
pub action: menu_option_action<'a, T>,
}
impl<'a, T> Clone for menu_option<'a, T> {
fn clone(&self) -> Self {
menu_option {
command: self.command.clone(),
description: self.description.clone(),
action: self.action.clone(),
}
}
}
pub enum menu_option_action<'a, T> {
sub_menu(Vec<menu_option<'a, T>>),
callback(fn(T) -> T),
leave,
}
impl<'a, T> Clone for menu_option_action<'a, T> {
fn clone(&self) -> Self {
match self {
menu_option_action::sub_menu(sub) => menu_option_action::sub_menu(sub.to_vec()),
menu_option_action::callback(f) => menu_option_action::callback(*f),
menu_option_action::leave => menu_option_action::leave,
}
}
}
fn main() {
let mut state: StateType = 88;
let leave_option: menu_option<&mut StateType> = menu_option {
command: "l",
description: "leave",
action: menu_option_action::leave,
};
let a = leave_option.clone();
}
type StateType=i32;
发布结构菜单_选项,
}
恳求{
fn克隆(&self)->self{
菜单选项{
命令:self.command.clone(),
description:self.description.clone(),
操作:self.action.clone(),
}
}
}
发布枚举菜单(选项(操作>),
回调(fn(T)->T),
离开
}
恳求{
fn克隆(&self)->self{
匹配自我{
菜单选项动作::子菜单(sub)=>菜单选项动作::子菜单(sub.to_vec()),
菜单选项动作::回调(f)=>菜单选项动作::回调(*f),
菜单选项动作::离开=>菜单选项动作::离开,
}
}
}
fn main(){
让mut state:StateType=88;
让我们离开选项:菜单选项=菜单选项{
命令:“l”,
描述:“离开”,
动作:菜单选项动作::离开,
};
设a=leave_option.clone();
}
顺便说一句,惯用的Rust使用snake\u case
表示变量、方法、宏、字段和模块<代码>大写用于类型和枚举变量;对于静力学和常数,SNAKE\u案例
。
// In my actual code I construct a vector of `menu_option`s
fn example() {
type StateType = i32;
let mut state: StateType = 88;
let leave_option: menu_option<&mut StateType> = menu_option::<&mut StateType> {
command: "l",
description: "leave",
action: menu_option_action::leave,
};
let a = leave_option.clone();
}
type StateType = i32;
pub struct menu_option<'a, T> {
pub command: &'a str,
pub description: &'a str,
pub action: menu_option_action<'a, T>,
}
impl<'a, T> Clone for menu_option<'a, T> {
fn clone(&self) -> Self {
menu_option {
command: self.command.clone(),
description: self.description.clone(),
action: self.action.clone(),
}
}
}
pub enum menu_option_action<'a, T> {
sub_menu(Vec<menu_option<'a, T>>),
callback(fn(T) -> T),
leave,
}
impl<'a, T> Clone for menu_option_action<'a, T> {
fn clone(&self) -> Self {
match self {
menu_option_action::sub_menu(sub) => menu_option_action::sub_menu(sub.to_vec()),
menu_option_action::callback(f) => menu_option_action::callback(*f),
menu_option_action::leave => menu_option_action::leave,
}
}
}
fn main() {
let mut state: StateType = 88;
let leave_option: menu_option<&mut StateType> = menu_option {
command: "l",
description: "leave",
action: menu_option_action::leave,
};
let a = leave_option.clone();
}