reflection - 反射的惯用替代

标签 reflection rust

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

getattr(Digest, myAlgorithm)

...但是根据我在 Google 上的搜索结果,这不是 Rust 等语言的最佳实践(而且我没有找到有关如何完成的详细信息)。我最初的想法是使用模式匹配:

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

但是,这是行不通的,因为虽然匹配的所有分支都实现相同的特征,但它们最终是不同的类型。此外,假设有解决办法,在代码中手动枚举所有这些选项会很麻烦。

在 Rust 中执行此操作的正确方法是什么?

最佳答案

由于所有算法都实现了相同的特征 Digest ,它提供了您需要的一切,您可以将所有算法装箱并将它们转换为通用的 Box<Digest> :

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

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

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

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

关于reflection - 反射的惯用替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486227/

相关文章:

java - 实例化参数类型的空对象

c# - 递归获取标有属性的属性

rust - 如何同步返回在异步 Future 中计算的值?

rust - 编译bevy_dylib v0.5.0错误: linking with `cc` failed: exit status: 1

rust - 如何在将字段移动到新变体时更改枚举变体?

rust - 是否有更简单的方法来获取 Actix-Web HTTP header 的字符串值?

.net - 应该在多大程度上使用反射?

java - 删除 .clone 的反射警告

Java 泛型和反射

c++ - 除了使用设计选择之外,是否不允许访问类型不同的数组元素?