2
votes

Dans Rust, comment passer une fonction divergente comme paramètre à une autre fonction

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?


0 commentaires

4 Réponses :


1
votes

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:


0 commentaires

9
votes

! 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.

Voir aussi


0 commentaires

2
votes

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.

Lien Playground


0 commentaires

6
votes

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.


0 commentaires