繁体   English   中英

如何创建 Struct 方法并在 Rust 中使用它们

[英]How to create Struct methods and use them in Rust

我对 Rust 编程语言比较陌生。 我正在学习结构和枚举。 我创建了一个程序来存储星期几并查看是否是周末作为测试程序。 代码如下:

#[derive(Debug)]
enum DaysOfTheWeekNames {
    Friday,
    Saturday,
    Sunday,
}

#[derive(Debug)]
struct Weekday {
    day: DaysOfTheWeekNames,
    weekend: bool,
}

impl Weekday {
    fn isWeekend(day: DaysOfTheWeekNames) -> bool {
        match day {
            DaysOfTheWeekNames::Saturday => false,
            DaysOfTheWeekNames::Sunday => false,
            other => true,
        }
    }
    
    fn new_day(day: DaysOfTheWeekNames) -> Self {
        Self { day, weekend: Weekday::isWeekend(day) }
    }
}

fn main() {
    let today = Weekday::new_day(DaysOfTheWeekNames::Saturday);
    println!("Today: {:#?}", today);
}

所以我的目标是创建一个名为 Weekday 的结构,并希望使用名为 new_day() 的方法对其进行初始化,我只将工作日的名称传递给该方法。 这个 function 应该调用 isWeekend() 方法来查找是否是周末。 但是上面的代码如预期的那样抛出错误,因为变量name的所有权被移到了 isWeekend function 而没有传回。 那么编写这样一个用例的理想方式是什么,我们应该如何解决这个问题呢?

我看到的错误如下:

error[E0382]: use of moved value: `day`
   --> src/main.rs:115:50
    |
114 |     fn new(day: DaysOfTheWeek) -> Self {
    |            --- move occurs because `day` has type `DaysOfTheWeek`, which does not implement the `Copy` trait
115 |         Self { day, weekend: Weekday::is_weekend(day) }
    |                --- value moved here              ^^^ value used here after move

解决了这个问题。 说明:由于 isWeekend 是一个结构方法,我们不应该传递我们在上面所做的实例的结构字段(即天)。 要解决这个问题,我们必须复制或克隆 day 参数,然后将其传递给 isWeekend() function。

代码:

#[derive(Debug)]
#[derive(Clone, Copy)]
enum DaysOfTheWeekNames {
    Friday,
    Saturday,
    Sunday,
}

#[derive(Debug)]
struct Weekday {
    day: DaysOfTheWeekNames,
    weekend: bool,
}

impl Weekday {
    fn is_weekend(day: DaysOfTheWeekNames) -> bool {
        match day {
            DaysOfTheWeekNames::Saturday => true,
            DaysOfTheWeekNames::Sunday => true,
            _ => false,
        }
    }
    
    fn new_day(day: DaysOfTheWeekNames) -> Self {
        Self { day, weekend: Weekday::is_weekend(day.clone()) }
    }
}

fn main() {
    let today = Weekday::new_day(DaysOfTheWeekNames::Saturday);
    println!("Today: {:#?}", today);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM