【问题标题】:How do I get the value from an enum in a vec?如何从 vec 中的枚举中获取值?
【发布时间】:2020-08-09 22:54:32
【问题描述】:

我定义了一个枚举,如下所示(TableCell)。然后我创建一个 Vec(行)并将一个 TableCell 推入该行。然后我有另一个 Vec (table_data) 我将行推入。最后我输出存储在 table_data 中的值:

#[derive(Debug)]
enum TableCell {
    Label(String),
    Float(f32),
}

let mut row = vec![];

row.push(TableCell::Float(client_budget.cost)); //(client_budget.cost = 1000.00)

let mut table_data = Vec::new();

table_data.push(row);

for value in table_data.iter() {
    println!("{:#?}", value)
}

我的输出是 Float(1000.00)。我如何只获得 1000.00?

【问题讨论】:

  • 这能回答你的问题吗? Unwrap inner type when enum variant is known
  • 如果你不喜欢 Debug 的默认派生,要么自己实现它,要么使用带有 a different derivation 的 crate。
  • Ted:不确定我是否完全理解如何申请您的评论,但我尝试了 row.push(TableCell::Float(client_budget.cost).unwrap()) 和 row.push(TableCell: :float(client_budget.cost.unwrap())),两者都有编译错误。
  • 麦卡顿:我该怎么做?我是生锈的新手。指向我可以阅读的内容的链接?
  • 参见 Rust 编程语言的 Patterns that Bind to Values 部分。

标签: rust


【解决方案1】:

你可以的

// ...

for value in table_data.iter() {
    if let TableCell::Float(float) = value {
        println!("{}", float);
    }
}

或者如果您需要同时打印:

for value in table_data.iter() {
    match value {
        TableCell::Label(label) => println!("{}", label),
        TableCell::Float(float) => println!("{}", float),
    }
}

【讨论】:

  • Yhay 似乎不起作用,我得到一个类型不匹配:预期结构 std::vec::Vec,找到枚举 TableCell
【解决方案2】:

看了大家的cmet并研究了他们的建议,我终于找到了解决方案:

for value in table_data {
    for cell in value {
        match cell {
            TableCell::Label(label) => println!("{}", label),
            TableCell::Float(float) => println!("{}", float),
        }
    }
}

因为“值”的计算结果为 vec(即行变量),所以我必须遍历行中的所有 TableCell 以获得实际值。

感谢所有提出解决方案的人,他们都提供了帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2010-12-05
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多