我很开心玩Rust很长一段时间都是C#程序员,但我对反思有疑问.
嗯,我认为反思,也许我不需要在这种情况下进行反思,但鉴于Rust是强烈打字我怀疑我做的(我肯定需要它在好的'C#,祝福它的棉袜).
是的,所以说我有这种情况:
use std::collections::HashMap;
fn invoke_an_unknown_function(
hashmap: HashMap<String, String>,
// Something to denote a function I know nothing about goes here
) {
// For each key in the hash map, assign the value
// to the parameter argument whose name is the key
// and then invoke the function
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我猜我需要传递一些MethodInfo作为函数的第二个参数,然后用它来解决它的名字是哈希映射中的键的参数并分配值,但我看了一下反射API并发现以下内容:
但他们都没有给我足够的继续开始.那么,我将如何实现上面描述的功能呢?
我试图根据配置字符串选择摘要算法(来自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中这样做的正确方法是什么?