Il y a un mois, j'ai obtenu mon premier emploi et suis devenu développeur stagiaire, notre équipe utilise le langage Scala. Il me semble que tous les développeurs novices du premier jour sont perdus. en même temps des tas de nouveaux noms, technologies, quelques règles, et on ne sait jamais quoi, absolument tout est nouveau pour vous, c'est le premier travail. Dans mon cas, je ne connaissais toujours pas la langue dans laquelle je programme, jusqu'à l'interview dont je n'avais jamais entendu parler. Conclusion: le premier jour, j'étais en pleine forme. Demandez comment puis-je obtenir ce travail? Je connaissais Java, lors de l'interview on m'a dit que le javista pourra se rendre au rocher assez facilement et vous ne pouvez pas vous inquiéter. Mais apparemment, un peu d'avance en valait la peine, car la première fois devant moi, je n'ai vu que des écrans remplis de texte, dans lesquels presque la moitié était immédiatement claire.
Mais même le fait que je ne comprenais pas quelque chose a apporté plus d'inconfort, mais le fait qu'il y en avait beaucoup différent, et même le type de la variable vient après le nom, et parfois il n'existe pas du tout.
final String str = "abc";
val str = "abc"
Voici comment la fonction est décrite:
int sum(int a, int b) {return a+b;}
def sum(a: Int, b: Int) = {a + b}
Et Scala dispose également d'une console REPL (Read-eval-print-loop), comme par exemple en Python. Comme vous l'avez déjà remarqué, les points-virgules sont manquants. Vous pouvez exécuter des programmes d'une seule page sans principal, les noms des méthodes et des variables peuvent contenir et commencer par n'importe quel caractère, pas de règles. Il n'y a pas statique, mais il y a Object, il y a aussi des objets primitifs, == il y a en fait des égaux. Si la méthode n'a pas de paramètres, il n'est pas nécessaire de mettre fin à l'appel de méthode, les parenthèses sont également facultatives s'il n'y a pas de paramètres, et si elle ne prend qu'un seul paramètre, alors vous pouvez écrire comme ceci:
str.charAt(5);
str charAt 5
Et un autre exemple intéressant:
val res = 1 + 1
Non, ce n'est pas seulement 1 plus 1, ici l'objet 1, la méthode + est appelée et l'objet 1 lui est transmis comme seul paramètre. Pour moi, c'était une rupture de modèle.
À mon grand choc est venu un merveilleux livre de David Pollack - Beginning Scala. Le livre commence par une phrase, après quoi j'ai réalisé que je devais le lire jusqu'au bout:
Aïe! Ça me fait mal au cerveau! Arrête de me faire penser différemment. Oh, attends ... ça fait moins mal maintenant. Je comprends. Cette façon différente de résoudre le problème présente certains avantages. C'est ce que j'ai ressenti après ma première année de droit. J'ai ressenti cela pendant un moment quand j'ai commencé à coder Scala.
David a une énorme expérience en programmation, il a démarré cette entreprise 20 ans avant ma naissance, a réussi à travailler avec plus de 10 langages de programmation, jusqu'à son arrivée à Scala. Et maintenant, il dit:
Scala est un langage de programmation qui offre aux développeurs une expérience hors du commun.
Néanmoins, l'auteur avertit honnêtement que la maîtrise de ce n'est pas si facile, il lui a fallu 2 ans pour le faire, mais il espère que nous pourrons plus vite et il l'aidera. Ce n'est pas un livre très simple et cela implique une certaine expérience en programmation avec le lecteur. Surtout ceux qui ont précédemment programmé en Java l'aimeront, car il existe de nombreuses références à ce langage et peuvent être comparées.
En plus de Beginning Scala, j'ai également lu les leçons Scala School de Twitter, pour toutes les leçons il y a une traduction en russe, mais le livre de David Pollack n'a été trouvé que dans la version anglaise.
Le projet Scala Exercises a aidé à consolider la théorie en plus des voyages indépendants à travers la source de la roche et du travail, il y a des tâches très simples, mais elles sont tout à fait appropriées pour fixer certains aspects au début et vérifier que vous avez soigneusement lu et compris tout correctement.
Et je vais vous parler un peu des choses les plus courantes et les plus simples que je devais comprendre en premier lieu.
Option En un mot - c'est un conteneur dans lequel est soit vide (aucun, il ressemble à null, mais a des méthodes map, filter, ...), ou il y a exactement une valeur Some (valeur) et son utilisation peut rendre le code plus sécurisé et ne lève pas d'exception NullPointerException, car vous le souhaitez, vous ne le souhaitez pas, mais vous devez toujours extraire les données propres d'Option, et à ce stade, il est déjà difficile d'oublier d'écrire un chèque.
Bien sûr, Option a une méthode get, mais il n'est pas recommandé de l'utiliser car dans ce cas, tout le point d'Option est perdu, car None.get lève une exception.
Certaines des commodités les plus évidentes:
Il est facile de retourner la valeur par défaut si l'option est vide
optValue.getOrElse(defaultValue)
En cas d'action:
optValue match { case Some(value) => action case None => defaultAction }
Exemple de Scala Beginning. Le chemin est une certaine base de données qui contient des types de personne
def findPerson(key: Int): Option[Person]
La méthode retournera Some [Person] si une telle entrée est trouvée et None sinon.
Maintenant, nous voulons obtenir l'âge de l'utilisateur par clé.
def ageFromKey(key: Int): Option[Int] = findPerson(key).map(_.age)
Nous n'avons pas eu à tester None et la méthode s'est avérée très concise.
Correspondance de motif . Au début, je pensais que c'était le même commutateur Java et je ne l'utiliserai guère, mais ce n'est pas le cas. À Scala, c'est l'une des conceptions les plus utilisées.
Type de casting:
obj match { case str: String => str case number: Int => number }
Vous pouvez ajouter des conditions supplémentaires et ajouter une action par défaut.
obj match { case strWithA: String if strWithA.contains("a") => strWithA case negative: Int if negative < 0 => negative case zero if zero == 0 => zero case _ => defaultAction }
Il est extrêmement pratique d'utiliser la correspondance de motifs avec les classes de cas. Exemple de Scala Beginning
Stuff("David", 45) match { case Stuff("David", age) if age < 30 => "young David" case Stuff("David", _) => "old David" case _ => "Other" }
Les fonctionsPour commencer, dans Scala, les fonctions sont des instances qui implémentent une certaine interface, ou plutôt un trait FunctionX, où X est le nombre de paramètres et prend une valeur de 1 à 22. Dans ce bac, la seule méthode est aplly, qui est appelée pour la fonction. Puisque les fonctions sont des instances ordinaires, nous pouvons les passer et les renvoyer à partir des méthodes et des fonctions.
Exemple de Scala Beginning. Nous passons dans une réponse une fonction de Int à String, et elle retourne le résultat de cette fonction avec le paramètre 42.
def answer(f: Function1[Int, String]) = f(42)
ou la même chose
def answer(f: Function1[Int, String]) = f.apply(42)
Une chose très pratique est les combinateurs fonctionnels /
Ne laissez que des éléments positifs dans le tableau:
arr.filter(value => value > 0)
Un exemple un peu plus complexe. Calculez la somme des valeurs de la fonction f à partir des éléments positifs de la liste. 2 façons de le faire:
list.filter(x => x > 0).foldLeft(0)(_ + f(_)) list.filter(x => x > 0).map(f).sum
Et à la fin, je voudrais dire pourquoi j'ai écrit tout cela. Je ne voulais enseigner la scala à personne ni parler de la langue en tant que telle, il y a beaucoup de ces articles sur le Habré et sur Internet, et beaucoup sont très bons et utiles. Mon objectif était simplement de raconter mon histoire, qui pourrait être intéressante pour quelqu'un et pourrait aider et soutenir certains des mêmes nouveaux venus perdus, que le destin venait de rencontrer contre ce rocher. Je vous souhaite bonne chance! Les programmeurs expérimentés sont encouragés à partager leurs conseils et opinions dans les commentaires concernant le cheminement d'un programmeur Scala novice.