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();
}