gpt4 book ai didi

rust - 如何有条件地将类型分配给引用

转载 作者:行者123 更新时间:2023-11-29 08:01:35 31 4
gpt4 key购买 nike

我今天下午一直在研究 Rust,并决定编写一个简单的哈希工具,它可以执行所有主要的摘要算法。

我正在尝试做这样的事情(意图应该很明显):

let mut hasher;
match alg {
"md5" => { hasher = Md5::new() }
"sha1" => { hasher = Sha1::new() }
_ => { println!("Algorithm not implemented");
process::exit(1); }
}
hash_file(&file_name, &mut hasher).unwrap();

当编译上面的代码时,由于第一个匹配,它假定 hasher 是 Md5 类型并且在 "sha1" 匹配分支中失败,它尝试分配一个 Sha1 类型。我打算在此匹配语句中使用的所有类型都是特征 Digest 的实现者,所以我觉得应该有一种方法可以做到这一点。

我试过:

let mut hasher: Digest;

但这也没有用。

最佳答案

除了creating a boxed trait object ,您还可以引用特征对象。这避免了堆分配:

trait Hasher { fn hash(&self) -> u8 { 42 } }

struct Md5;
struct Sha1;

impl Hasher for Md5 {}
impl Hasher for Sha1 {}

fn hash_it(which: &str) {
let (md5, sha1);

let hasher: &Hasher = match which {
"md5" => {
md5 = Md5;
&md5
},
"sha1" => {
sha1 = Sha1;
&sha1
},
_ => unreachable!("Nope"),
};

hasher.hash();
}

fn main() {
hash_it("md5");
hash_it("sha1");
}

请注意,每个实现者仅在适当的匹配臂中创建,因此您不会做超出需要的工作。

关于rust - 如何有条件地将类型分配给引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259428/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com