Я сегодня играл с 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();
При составлении выше, в связи с первым матчем, он предполагает, что мясорубка имеет тип Md5
и терпит неудачу, когда в ветвь соответствия "sha1"
, она пытается присвоить тип Sha1
. Все типы, которые я намереваюсь использовать в этом утверждении соответствия, являются разработчиками признака Digest
, поэтому я чувствую, что должен быть способ сделать это.
Я пробовал:
let mut hasher: Digest;
Но это не сработало.
Если бы я увидел этот код в C или C++, я бы сразу же отклонить его при просмотре коды, потому что, принимая ссылку на потенциально неинициализированное значение таит в себе опасность (следующей операции технического обслуживания, он будет дуть вверх). Здесь я смотрю на это и просто киваю. Это действительно так освобождает, когда вы можете доверять языку/компилятору. –
@ MatthieuM. Разве это не правда! Я всегда с удовольствием помню, что в этом случае переменные также не должны быть «мутными». – Shepmaster