Les fonctions non divergentes fonctionnent bien
error[E0658]: The `!` type is experimental (see issue #35121) --> examples/two_tasks.rs:44:31 | 44 | fn test_diverging(f: &Fn() -> !) {} | ^
Mais je ne peux pas accepter une fonction divergente comme celle-ci
fn test_diverging(f: &Fn() -> !) {}
J'obtiens ce qui suit erreur
fn test(f: &Fn() -> u8) {}
En regardant le problème # 35121 Je pourrais voir comment cela pourrait résoudre le problème, mais en attendant, y a-t-il une solution?
4 Réponses :
Pour utiliser la fonctionnalité instable, vous devez utiliser la chaîne d'outils de nuit et activer la fonctionnalité instable souhaitée.
#![feature(never_type)] fn test_diverging(f: &Fn() -> !) {}
Voir aussi:
!
dans certains contextes est encore expérimental, ce qui signifie qu'il n'est pas disponible sur le compilateur stable (1.33 à partir d'aujourd'hui). Vous pouvez l'utiliser sur le compilateur nocturne, mais vous devez vous inscrire explicitement à feature(never_type)
:
#![feature(never_type)] fn test_diverging(f: &Fn() -> !) {}
( terrain de jeu )
Attention, cela signifie que la fonctionnalité peut encore changer avant la stabilisation , vous acceptez donc le risque qu'une future version du compilateur casse votre code.
Si vous souhaitez rester stable, vous pouvez utiliser Void (essentiellement une énumération sans variantes , qui ne peut pas être construit sans unsafe) comme solution de contournement.
L'utilisation du type Never dans les fonctions et les types de pointeur de fonction est déjà stable. Donc, si vous n'avez pas besoin d'utiliser le trait Fn
, vous pouvez simplement utiliser ceci:
fn test_diverging(f: fn() -> !) {} // ^ note the lowercase f test_diverging(|| panic!("ouch"));
De cette façon, vous ne pouvez pas passer des fermetures qui font référence à leur environnement, mais les fermetures sans capture et les fonctions standard fonctionnent bien.