EDIT
Je précise, parce qu’au vu des réponses, cela n’est pas aussi évident que je le pensais : ma question s’adresse à ceux qui connaissent le Rust, puisqu’elle porte sur une bonne pratique spécifique à ce langage. Une réponse généraliste n’apportera pas de solution à mon problème. Merci de votre compréhension.
Salut à tous.
Je joue à essayer d’adapter des fonctions de la bibliothèque standard du Haskell en Rust, pour tester les limites de l’aspect fonctionnel de ce dernier, et je me suis retrouvé face à un obstacle inattendu.
La fonction Haskell que je cherche à adapter est la suivante.
1 2 | fromMaybe :: a -> Maybe a -> a fromMaybe d x = case x of {Nothing -> d; Just v -> v} |
C’est très bateau : on fournit une valeur par défaut d
et une valeur Maybe
(le type Option
de Rust), et si elle vaut Nothing
(None
en Rust), la fonction renvoie d
, si elle vaut Just v
(Option(v)
en Rust), la fonction renvoie v
.
Transposé en Rust, ça donne ça.
1 2 3 4 5 6 | fn fromMaybe<A> (d : &A, x : &Maybe<A>) -> &A { match *x { Maybe::Nothing => d, Maybe::Just(ref v) => v } } |
À la compilation, j’obtiens l’erreur suivante.
1 2 3 4 5 | maybe.rs:31:44: 31:46 error: missing lifetime specifier [E0106] maybe.rs:31 fn fromMaybe<A> (d : &A, x : &Maybe<A>) -> &A { ^~ maybe.rs:31:44: 31:46 help: run `rustc --explain E0106` to see a detailed explanation maybe.rs:31:44: 31:46 help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `d` or `x` |
Ce qui est parfaitement logique quand on y réfléchit. Ma question ne porte donc pas sur la raison de cette erreur, mais serait plutôt : quelle serait la solution intelligente à ce problème ?
J’ai bien pensé à rajouter une durée de vie identique pour les deux paramètres et la sortie, et ça compile effectivement, mais a priori, rien ne me permet vraiment d’affirmer que les deux paramètres donnés en entrée auront la même durée de vie. Est-ce que je passe à côté de quelque chose ?