1/10 : Trucs et astuces pour la migration vers Scala 3. Un vrai plus ! Important : lisez attentivement le guide de migration et utilisez Scalafix pour les mises à jour de syntaxe. docs.scala-lang.org/scala3/guides/…s de travail manuel !
2/10: Don't rush to replace everything with new syntax! First make your codebase compile with the old syntax but using the Scala 3 compiler. The new syntax has its own rules and can cause confusing errors if you're unfamiliar, especially when mixed with the old syntax.
3/10 Lorsque vous remplacez des paramètres implicites par « using », n'oubliez pas que tous les paramètres explicites transmis sur les sites d'appel nécessitent également le mot-clé « using » ! getUserInfo(userId)(using Tracing.noop) // correct
4/10 : Oublier le mot-clé « using » entraîne des erreurs complexes. Le compilateur peut mettre en évidence une partie complètement différente de votre code, ce qui rend le débogage frustrant. J'ai perdu beaucoup de temps à essayer de comprendre ce qui se passe.
5/10 : Avertissement concernant circe : lors de la migration d'une dérivation semi-automatique comme `deriveConfiguredCodec` vers `Codec.derived`, soyez prudent ! `Decoder.derived` n'accepte pas `Configuration` comme paramètre implicite — utilisez plutôt `Decoder.derivedConfigured`.
6/10 : Vous pouvez éviter complètement le problème de circe grâce à la nouvelle syntaxe derives : case class MyClass(...) derives ConfiguredCodec. J'ai failli pousser un bug en production, car je pensais que Decoder.derived se comporterait de la même manière. Grâce à un autre problème, j'ai pu le découvrir suffisamment tôt.
7/10 : Utilisateurs de Doobie : attention aux messages d'erreur géants concernant les instances Get/Put manquantes. Dans mon cas, les classes AnyVal étaient en cause : le compilateur ne pouvait plus dériver d'instances comme auparavant.
8/10 : Solution au problème doobie : convertir les classes AnyVal en types opaques et fournir les instances données dans l'objet compagnon.
9/10 : J'ai rencontré un problème avec le code hérité utilisant une syntaxe de tuple sans forme (supprimée dans Scala 3). J'avais besoin d'un moyen d'ajouter des éléments de tuple et de les convertir en classes de cas. J'ai d'abord essayé la syntaxe de tuple native de Scala 3, mais elle était incompatible avec CaseClass.tupled.
10/10 : Après avoir essayé des extensions personnalisées pour les tuples (qui comportaient des risques d'échec à l'exécution), j'ai découvert que la bibliothèque Chimney était la meilleure solution pour assembler des tuples avec des valeurs supplémentaires. Bonus : j'ai même trouvé un bug dans la dernière version de Chimney !
Quelles astuces de migration avez-vous découvertes ? Partagez-les ci-dessous ! #Scala #Scala3
Bonus n°1 : vous pouvez remplacer someContextualResource.flatMap { implicit tracing => ... } par someContextualResource.flatMap { case given TracingCtx => ... } pas parfait mais fonctionne, mieux que de mélanger les données avec les implicites dans le même fichier et la même base de code.