习惯性的替代反射

Xop*_*ter 6 reflection rust

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

getattr(Digest, myAlgorithm)
Run Code Online (Sandbox Code Playgroud)

...但是从我能够使用谷歌开始,这不是像Rust这样的语言的最佳实践(而且我没有找到关于如何完成的细节).我最初的想法是使用模式匹配:

let mut digest = match myAlgorithm {
  "sha256" => Sha256::new(),
  ...
};
Run Code Online (Sandbox Code Playgroud)

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

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

oli*_*obk 9

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

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

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

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

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