【问题标题】:How do I iterate through the types that implement a trait如何遍历实现特征的类型
【发布时间】:2021-10-08 18:15:17
【问题描述】:

我正在处理货币。

我希望能够从“USD”等股票代码中解析它们。

我已经实现了一个货币特征,我想要一个编译时股票代码。

我想遍历所有实现 Currency 的类型,以检查它们的股票代码是否等于正在解析的字符串。如果是这样,我想返回该货币的一种类型。

到目前为止我有这个:

pub trait Currency {
    const TICKER_SYMBOL: String;
}

#[derive(debug)]
struct USD;
impl Currency for USD { const TICKER_SYMBOL:  String = "USD".to_string();}

impl FromStr for dyn Currency {
    type Err = &'static str;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        todo!()
    }
}

【问题讨论】:

  • 没有这样的东西。您必须自己创建一个集合以进行迭代。
  • 出于好奇:为什么要在类型系统中表示不同的货币?为什么不使用 struct Currency { ticker_symbol: String } 之类的东西?
  • 我建议使用枚举而不是具有不同货币的特征

标签: rust metaprogramming


【解决方案1】:

strum crate + 枚举给了我想要的东西。

use std::str::FromStr;
use strum_macros::EnumString;

#[derive(Debug, PartialEq, EnumString)]
enum Currency {
    USD,
    BTC
}

    #[test]
    fn parses_currencies() {
        let c = Currency::from_str("USD");
        assert_eq!(Ok(Currency::USD), c);
        let err = Currency::from_str("monopoly money");
        assert!(err.is_err());
    }

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多