Я пытаюсь получить генератор случайных чисел.Так как OsRng::new()
может дать сбой, я бы хотел вернуться к thread_rng()
, если мне нужно:
extern crate rand; // 0.6.5
use rand::{rngs::OsRng, thread_rng, RngCore};
fn rng() -> impl RngCore {
match OsRng::new() {
Ok(rng) => rng,
Err(e) => thread_rng(),
}
}
Однако я получаю это сообщение об ошибке, которое не могу понять:
error[E0308]: match arms have incompatible types
--> src/lib.rs:6:5
|
6 | / match OsRng::new() {
7 | | Ok(rng) => rng,
8 | | Err(e) => thread_rng(),
| | ------------ match arm with an incompatible type
9 | | }
| |_____^ expected struct `rand::rngs::OsRng`, found struct `rand::prelude::ThreadRng`
|
= note: expected type `rand::rngs::OsRng`
found type `rand::prelude::ThreadRng`
Почему компилятор ожидает rand::OsRng
здесь вместо реализации RngCore
?Если я удаляю match
и напрямую возвращаю thread_rng()
, я не получаю сообщение об ошибке выше.
Я не верю, что это дубликат Как мне вернуть экземплярtrait от метода? , так как другой вопрос спрашивает о как можно вернуть черту из функции, и этот вопрос о , почему компилятор не позволит мневернуть признак, но хочет, чтобы я возвратил OsRng
, который не является типом возврата функции.