rust 无法编译具有值的枚举实现方法

nhhxz33t  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(135)

这个编译不了为什么
编译器对set_fred()方法很满意,但对get_fred()和get_fred_mut()不满意,因为它们引用了同一个Fred(String)。

fn main() {
    println!("Unable to compile enum impl methods with values");
}

enum Flintstone {
    Fred(String),
    Wilma(i32),
}

impl Flintstone {
    fn set_fred(&mut self, fred: String) {
        *self = Flintstone::Fred(fred);
    }

    // error[E0609]: no field `Fred` on type `Flintstone`
    fn get_fred(self) -> String {
        self.Fred
    }

    // error[E0609]: no field `Fred` on type `&mut Flintstone`
    fn get_fred_mut(&mut self) -> &mut String {
        &mut self.Fred
    }
}
gwbalxhn

gwbalxhn1#

他们有几个问题。
首先是这个方法的签名get_fred(self)它应该是get_fred(&self)看看下面的例子

struct Test(i32);

impl Test {
    fn new() -> Self {
        return Self(3);
    }
    
    fn get(self) -> i32 {
        return self.0;
    }
} 

fn main() {
    let t = Test::new();
    
    // Unsurprisingly it prints "The value: 3"
    println!("The value: {}", t.get());
    
    // Because as it is declared self instead of &self in get(self)
    // The ownership is take and t is now doroped
    println!("The value: {}", t.get());
}

此处提供更全面的说明When to use self, &self, &mut self in methods?
接下来,枚举只有一种状态,在本例中是燧石族::Fred(字符串)或燧石族::Wilma(i32)。
所以你可以这样处理

fn get_fred(&self) -> String {
    match self {
        Flintstone::Fred(a) => a.clone(), //<-- Because a is an `&String`
        _ => "".to_string()
    }
}

而且那只杂种狗也没什么意义

fn get_fred_mut(&mut self) -> &mut String {
    match self {
        Flintstone::Fred(ref mut a) => a,
        _ => panic!("No fred")
    }
}

相关问题