习惯性的替代反射

时间:2015-05-27 15:00:23

标签: reflection rust

我正在尝试根据配置字符串选择摘要算法(来自rust-crypto)。比方说,在Python或JavaScript中,我可能会使用反射来实现这个目标:

getattr(Digest, myAlgorithm)

...但是从我能够使用的Google来看,这不是Rust等语言的最佳实践(另外,我还没有找到有关如何完成的详细信息) 。我最初的想法是使用模式匹配:

let mut digest = match myAlgorithm {
  "sha256" => Sha256::new(),
  ...
};

然而,这并不起作用,因为虽然比赛的所有分支都实现了相同的特征,但它们最终是不同的类型。此外,假设有一种解决方法,在代码中手动枚举所有这些选项会很麻烦。

在Rust中这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

由于所有算法都实现了相同的特性Digest,它提供了您需要的一切,您可以将所有算法包装起来并将它们转换为公共Box<Digest>

let mut digest: Box<Digest> = match my_algorithm {
    "sha256" => Box::new(Sha256::new()),
    ...
};

现在你不知道类型是什么,但你仍然知道它是Digest

python和javascript在后台为你做拳击(动态堆分配)。 Rust对此类事情非常挑剔,因此需要您明确说明您的意思。

在Rust中反射能够枚举实现特征的范围内的所有类型会很有趣,但是这样的系统在生锈编译器和生锈社区成员的大脑中需要相当多的努力。不要指望它很快。