Por que a característica impl não pode ser usada para retornar vários tipos / condicionais?
Estou tentando obter um gerador de números aleatórios. Desde aOsRng::new()
pode falhar, eu gostaria de voltar athread_rng()
se eu tiver que:
extern crate rand; // 0.5.5
use rand::{thread_rng, OsRng, RngCore};
fn rng() -> impl RngCore
{
match OsRng::new() {
Ok(rng) => rng,
Err(e) => thread_rng()
}
}
No entanto, recebo esta mensagem de erro que não consigo entender:
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::OsRng`, found struct `rand::ThreadRng`
|
= note: expected type `rand::OsRng`
found type `rand::ThreadRng`
Por que o compilador está esperandorand::OsRng
aqui em vez de uma implementação deRngCore
? Se eu remover omatch
e retornar diretamentethread_rng()
, Eu não entendi a mensagem de erro acima.
Não acredito que seja uma duplicata deComo faço para retornar uma instância de uma característica de um método?, como a outra pergunta é sobrequão pode-se retornar uma característica de uma função, e esta pergunta é sobreporque o compilador não permitirá que eu retorne uma característica, mas quer que eu retorne umaOsRng
que não é o tipo de retorno da função.