编译期的报错信息是
cannot move out of *allergen
which is behind a shared reference
move occurs because *allergen
has type Allergen
, which does not implement the Copy
trait
代码如下
use self::Allergen::*;
#[derive(Debug, PartialEq, Eq)]
pub enum Allergen {
Eggs = 1 << 0,
Peanuts = 1 << 1,
Shellfish = 1 << 2,
Strawberries = 1 << 3,
Tomatoes = 1 << 4,
Chocolate = 1 << 5,
Pollen = 1 << 6,
Cats = 1 << 7,
}
const ALLERGENS: [Allergen; 8] =
[Eggs, Peanuts, Shellfish, Strawberries, Tomatoes, Chocolate, Pollen, Cats];
pub struct Allergies {
allergens: u32,
}
impl Allergies {
pub fn new(n: u32) -> Self {
Allergies { allergens: n }
}
pub fn is_allergic_to(&self, allergen: &Allergen) -> bool {
let allergen = *allergen as u32;
self.allergens & allergen == allergen
}
pub fn allergies(&self) -> Vec<Allergen> {
unimplemented!("Return the list of allergens contained within the score with which the Allergies struct was made.");
}
}
我觉得很神奇的是给pub enum Allergen加了 derive copy clone就能干掉报错
为什么呢?
1
共 4 条评论, 1 页
评论区
写评论你是贺老师么hhh
--
👇
hax10:
let allergen = *allergen as u32;
在这行,你新建的变量allergen将复制原来allergen引用所指的值。因此,这个值的类型必须实现Copy特征,不然编译器不知道怎么进行复制。
Copy特征的实现就是通过derive命令而自动生成的,Rust不允许你手动实现Copy。另外,Rust也要求所有实现Copy特征的类型同时实现Clone。克隆和复制的区别在于复制仅仅会把原数据的字节拷到新变量里头,但是克隆能调用你自己手写的克隆函数。
let allergen = *allergen as u32;
在这行,你新建的变量allergen将复制原来allergen引用所指的值。因此,这个值的类型必须实现Copy特征,不然编译器不知道怎么进行复制。
Copy特征的实现就是通过derive命令而自动生成的,Rust不允许你手动实现Copy。另外,Rust也要求所有实现Copy特征的类型同时实现Clone。克隆和复制的区别在于复制仅仅会把原数据的字节拷到新变量里头,但是克隆能调用你自己手写的克隆函数。
copy clone就是同名trait约束么,做什么的呢?
--
👇
Mike Tang: 自动实现了同名trait约束。
自动实现了同名trait约束。