vendredi 31 mai 2019

Scala implicit

Notion implicit en scala

La notion implicit de scala permet de faire : 
  • de passer automatiquement de paramètre à une méthode/fonction
  • de la conversion automatique;
  • d'ajouter de comportement dynamiquement à une classe.

Paramètre implicit


Un paramètre implicit injecté dynamiquement. La méthode sendMail dispose d'un paramètre from implicit. 


Lors qu’un paramètre d’une méthode/fonction est défini comme implicite, il n’est plus nécessaire de le spécifier lors de l’appel : le compilateur se charge de le déduire à partir du contexte.

À noter que, dans la signature d’une méthode, le mot clé implicit ne sert pas à déclarer un paramètre mais une liste de paramètres. Tous les paramètres implicites doivent être définis dans « la même paire de parenthèse ». Tous les paramètres suivant le mot clé seront donc des implicites  (dans l'exemple ci-dessus, body et from sont implicits)


On pourra bien appeler sendMail avec le paramètre from explicitement :



 ou déclarer  le paramètre from implicit de 3 manières : 

  • val 

  • def



  • object class si le paramètre est une structure complexe.


Il faudra noter :
  • la correspondance entre le paramètre implicite de la méthode sendMail et la variable est indépendante de leurs noms. Le compilateur utilise le type commun String pour lier from et sender,
  • deux variables implicites de même type dans la même portée provoquent une erreur de compilation, à la première utilisation. Dans notre exemple, on ne pourra pas avoir deux variables implicits de types String,
  • Pour pouvoir appeler la méthode sans le paramètre implicit depuis un autre fichier, il faudra faire import de l'object dans lequel le paramètre implicit est défini.

Conversion automatique


Cela consiste à définir une méthode de conversion implicit d'un type A à un type B. Le compilateur se charge d'appeler et effectuer automatiquement la conversion si nécessaire. Imaginons qu'on dispose d'une méthode show prenant en paramètre un type String :


Pour pouvoir appeler cette méthode avec les paramètres : Int, Double ou Float ou tout autre type, il faudra définir de méthodes implicit permettant de convertir Int en String, Double en String et Float en String :



Ajout d'un comportement dynamiquement à une classe


C'est une fonctionnalité proche de l'extension C#. Elle permet d'ajouter dynamiquement une nouvelle méthode à une classe existante. Prenons l'exemple du type String. On voulait ajouter une nouvelle méthode isPalindrome permettant de savoir si un String est un palindrome ou une autre méthode isQuestion pour savoir si une chaine de caractère est une question. Cela revient à faire :



Il suffit de définir une classe implicit avec un constructeur prenant en paramètre un String et définir les deux méthodes isPalindrome, isQuestion dans cette classe.


Une fois cette classe définie, il suffit de faire un import de RicheType pour pouvoir appeler les méthodes isPalindrome, isQuestion sur le type String


On pourra effectuer la même chose pour d'autres types notamment de type custom Person ...







Aucun commentaire:

Enregistrer un commentaire