impl Trait
не эквивалентно возврату объекта интерфейса или базового класса. Это способ сказать: «Я не хочу писать имя конкретного типа, который я возвращаю». Вы по-прежнему возвращаете значение одного определенного типа; вы просто не говорите, какой тип.
Каждая из этих ветвей возвращает разные типы, поэтому проблема. Одного и того же признака недостаточно.
То, что вы, скорее всего, захотите в этом конкретном случае, - это такой объект-объект Box<dyn RngCore>
.
fn rng() -> Box<dyn RngCore>
{
match OsRng::new() {
Ok(rng) => Box::new(rng),
Err(_) => Box::new(thread_rng()),
}
}
Примечание . Если вы используете несколько более старую версию Rust, вам может потребоваться удалить dyn
ключевое слово. Это необязательно в текущем (2015) издании Rust.