返回 Rust 中 impl 的枚举

Nel*_*ila 2 rust

我正在尝试从结构的字段导出一个值,该字段是一个枚举,以避免输入错误,它会抛出一个错误,我无法返回它,而且我真的不知道我能做什么。

我无法移出self.package发生共享引用移动的后面,因为self.package具有 type issues::PackageManager,它没有实现该Copy特征。

pub enum PackageManager {
    NPM,
    PNPM,
    YARN,
}

pub struct ProjectStruct {
    name: String,
    description: String,
    version: u8,
    package: PackageManager,
}

pub trait Project {
    fn new(name: String, description: String) -> Self;

    fn set_version(&mut self, version: u8);
    fn get_version(&self) -> u8;

    fn set_name(&mut self, name: String);
    fn get_name(&self) -> String;

    fn set_package_manager(&mut self, package_manager: PackageManager);
    fn get_package_manager(&self) -> PackageManager;
}

impl Project for ProjectStruct {
    fn new(name: String, description: String) -> Self {
        ProjectStruct {
            name,
            description,
            version: 1,
            package: PackageManager::PNPM,
        }
    }

    fn set_version(&mut self, version: u8) {
        self.version = version
    }

    fn get_version(&self) -> u8 {
        self.version
    }

    fn set_name(&mut self, name: String) {
        self.name = name
    }

    fn get_name(&self) -> String {
        self.name.clone()
    }

    fn set_package_manager(&mut self, package_manager: PackageManager) {
        self.package = package_manager
    }

    fn get_package_manager(&self) -> PackageManager {
        /* * no error
        match self.package {
            PackageManager::NPM => PackageManager::NPM,
            PackageManager::PNPM => PackageManager::PNPM,
            PackageManager::YARN => PackageManager::YARN,
        }*/

        // error
        self.package

        /* *cannot move out of `self.package` which is behind a shared reference
        move occurs because `self.package` has type `issues::PackageManager`, which does not implement the `Copy` traitrustc */
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图返回不带开关的字段值,因为它可以包含多个选项。

Pit*_*taJ 6

错误“未实现该Copy特征”为您指明了正确的方向。您需要做的就是实现Copy该类型,这可以通过简单的派生来完成。

#[derive(Clone, Copy)] // Copy requires Clone
pub enum PackageManager {
    NPM,
    PNPM,
    YARN,
}
Run Code Online (Sandbox Code Playgroud)

操场

  • 如果您需要比较这些或转储它们以进行调试/显示,添加“Debug”、“Eq”和“PartialEq”等其他内容可能是一个好习惯。 (2认同)