【问题标题】:How to read a value of an enum which associates with a custom type in Rust?如何读取与 Rust 中的自定义类型相关联的枚举值?
【发布时间】:2019-02-25 12:03:10
【问题描述】:

我在 Rust 中有一个如下实现。在主函数中,我正在读取SalaryRange 枚举中的一个值,这将显示High("So High")

// This can be a complex type, just using string for the question 
type SRange = String;
type SalEnu = SalaryRange<SRange>;

struct User<SRange> {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
    income: Income<SRange>,
}

struct Income<SRange> {
    salary_range: SalaryRange<SRange>
}

#[derive(Debug)]
enum SalaryRange<SRange> {
    Low(SRange),
    Mid(SRange),
    High(SRange),
}

fn main() {
    let user1 = User {
        email: String::from("test@email.com"),
        username: String::from("test_name"),
        active: true,
        sign_in_count: 1,
        income: Income {
            salary_range: (
                SalaryRange::High("So High")
            )
        },
    };
    let mut srange: SalaryRange<&str> = user1.income.salary_range;
    println!("{:?}", srange);
}

example 的链接可在此处找到。

只是想知道是否有可能将该枚举中的值读取并打印为println!("{:?}", srange::High);,只是为了打印出字符串值? 我只想打印值So High

如果我使用srange::High 这将抛出一个错误提示

      println!("{:?}", srange::High);
|                      ^^^^^^ use of undeclared type or module `srange`
error: aborting due to previous error

【问题讨论】:

  • 不清楚你在问什么。你打算println!("{:?}", srange::High); 输出什么?
  • @PeterHall 更新只想打印So High
  • 我知道这不是你要问的,但你有一些非常可疑的变量命名可能会引起混淆。在SalaryRange&lt;SRange&gt; 中,SRange 是一个类型变量。但它的名称与您为String 创建的别名相同。在我的回答中,我将其重命名为 S 以避免混淆。
  • @PeterHall 是的,很抱歉造成混乱,它的真实类型是复杂的,添加 String 仅用于示例,谢谢
  • 字符串不是问题。当你看定义的时候,你可能会错误地认为Salary::Low持有的数据类型是SRange。但实际上类型可以是您决定的任何类型。从另一个角度来看,SRange 类型变量 正在遮蔽SRange 具体类型

标签: enums rust


【解决方案1】:

你可以在你的枚举上实现一个方法来提取值:

#[derive(Debug)]
enum SalaryRange<S> {
    Low(S),
    Mid(S),
    High(S),
}

impl<S> SalaryRange<S> {
    fn value(&self) -> &S {
        match self {
            SalaryRange::Low(value) => value,
            SalaryRange::Mid(value) => value,
            SalaryRange::High(value) => value,
        }
    }
}
println!("{:?}", srange.value());

【讨论】:

    【解决方案2】:

    您可以使用if let 语法对srange 进行模式匹配。

    if let SalaryRange::High(s) = srange {
        println!("{}", s);
    }
    

    将打印“这么高”。

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2021-08-15
      • 2011-09-11
      • 2016-07-17
      相关资源
      最近更新 更多