Il tentativo di compilare il seguente,Perché i parametri di tipo non sono consentiti su questo tipo?
fn do_it() -> Result<i32, u32> {
Result::<i32, u32>::Ok(3)
}
fn main() {
println!("{}", do_it());
}
risultati in:
./result_test.rs:2:14: 2:17 error: type parameters are not allowed on this type [E0109]
./result_test.rs:2 Result::<i32, u32>::Ok(3)
^~~
Perché i parametri di tipo non consentito su questo tipo?
Questo è un esempio minimo, il mio esempio del mondo reale è una macro cercando di restituire il seguente:
match $reader.$read_func() {
Ok(n) => Result::<$read_type, LocalReadError>::Ok(n),
Err(err) => Result::<$read_type, LocalReadError>::Err(
LocalReadError::from(err)
),
}
$read_func
è una funzione, $read_type
è il tipo di ritorno di quella funzione. (Se avessi un modo programmatico per farlo, lo farei: non so come, quindi è un argomento ...); così com'è, ottengo l'errore sopra riportato. Se rimuovo le specifiche dei parametri del generico, digita l'inteferenza che non riesce a capire il tipo. (?. Perché finisce con Result<_, LocalReadError>
in un ramo della match
, e Result<$read_type, _>
nell'altra Io non sono davvero sicuro Dice:
error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
match $reader.$read_func() {
^~~~~~~~~~~~
)
Nota: La domanda sul perché i parametri del tipo non sono ammessi viene data risposta di seguito. Risulta che questa non è la causa dell '"incapacità di dedurre informazioni di tipo sufficiente". (read_func
è una funzione, nel mio caso, sto passando una funzione di modello, ma dimentico il modello arg, che non può essere dedotto.)
Questo mi sembra straordinariamente un insetto. https://doc.rust-lang.org/nightly/error-index.html#E0109 mostra cosa dovrebbe fare. –
come soluzione al tuo problema attuale ti suggerisco di cambiare la tua macro in '$ reader. $ Read_func(). Map_err (LocalReadError :: from)' –
non sicuro se si tratta di un bug o se questo è effettivamente previsto, ma la sintassi che il lavoro sembra essere: 'Risultato :: Ok :: (3)'. [Box] (http://is.gd/xNUV9B) –