Premiers pas avec le langage Scala
Hello World en étendant l’application
object HelloWorld extends App {
println("Hello, world!")
}
[Démo en direct] (http://ideone.com/UgmX9y)
En étendant le App
[trait][1], vous pouvez éviter de définir une méthode main
explicite . Le corps entier de l’objet HelloWorld
est traité comme “la méthode principale”.
Initialisation retardée
Selon la documentation officielle,
App
utilise une fonctionnalité appelée Delayed Initialization. Cela signifie que les champs de l’objet sont initialisés après l’appel de la méthode principale.
Initialisation retardée
Selon la documentation officielle,
App
utilise une fonctionnalité appelée [Delayed Initialization][ 2]. Cela signifie que les champs de l’objet sont initialisés après l’appel de la méthode principale.
DelayedInit
est maintenant obsolète pour une utilisation générale, mais est toujours pris en charge pourApp
en tant que cas particulier. Le support continuera jusqu’à ce qu’une fonctionnalité de remplacement soit décidée et mise en œuvre.
Pour accéder aux arguments de ligne de commande lors de l’extension de App
, utilisez this.args
:
object HelloWorld extends App {
println("Hello World!")
for {
arg <- this.args
} println(s"Arg=$arg")
}
Lors de l’utilisation de App
, le corps de l’objet sera exécuté en tant que méthode main
, il n’est pas nécessaire de remplacer main
.
[1] : http://docs.scala-lang.org/tutorials/tour/traits.html [2] : http://www.scala-lang.org/api/current/#scala.DelayedInit
Hello World en définissant une méthode ‘main’
Placez ce code dans un fichier nommé “HelloWorld.scala” :
object Hello {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
Pour le compiler en bytecode exécutable par la JVM :
$ scalac HelloWorld.scala
Pour l’exécuter :
$ scala Hello
Lorsque le runtime Scala charge le programme, il recherche un objet nommé “Hello” avec une méthode “main”. La méthode main
est le point d’entrée du programme et est exécutée.
Notez que, contrairement à Java, Scala n’a aucune obligation de nommer les objets ou les classes après le fichier dans lequel ils se trouvent. Au lieu de cela, le paramètre Hello
passé dans la commande scala Hello
fait référence à l’objet à rechercher qui contient le main
méthode à exécuter. Il est parfaitement possible d’avoir plusieurs objets avec des méthodes principales dans le même fichier .scala
.
Le tableau args
contiendra les arguments de ligne de commande donnés au programme, le cas échéant. Par exemple, nous pouvons modifier le programme comme ceci :
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!")
for {
arg <- args
} println(s"Arg=$arg")
}
}
Compilez-le :
$ scalac HelloWorld.scala
Et puis exécutez-le:
$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3
Hello World en tant que script
Scala peut être utilisé comme langage de script. Pour illustrer, créez HelloWorld.scala
avec le contenu suivant :
println("Hello")
Exécutez-le avec l’interpréteur de ligne de commande (le $
est l’invite de ligne de commande) :
$ scala HelloWorld.scala
Hello
Si vous omettez .scala
(comme si vous avez simplement tapé scala HelloWorld
), le programme d’exécution recherchera un fichier .class
compilé avec un bytecode au lieu de compiler puis d’exécuter le script.
Remarque : Si scala est utilisé comme langage de script, aucun package ne peut être défini.
Dans les systèmes d’exploitation utilisant “bash” ou des terminaux shell similaires, les scripts Scala peuvent être exécutés à l’aide d’un “préambule shell”. Créez un fichier nommé “HelloWorld.sh” et placez ce qui suit comme contenu :
#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")
Les parties entre #!
et !#
constituent le ‘préambule du shell’ et sont interprétées comme un script bash. Le reste est Scala.
Une fois que vous avez enregistré le fichier ci-dessus, vous devez lui accorder des autorisations “exécutables”. Dans le shell, vous pouvez faire ceci :
$ chmod a+x HelloWorld.sh
(Notez que cela donne la permission à tout le monde : [lisez à propos de chmod][1] pour savoir comment le définir pour des ensembles d’utilisateurs plus spécifiques.)
Vous pouvez maintenant exécuter le script comme ceci :
$ ./HelloWorld.sh
[1] : https://en.wikipedia.org/wiki/Chmod
Fiche rapide Scala
Descriptif | Codage |
---|---|
[Attribuer une valeur int immuable][1] | val x = 3 |
[Attribuer une valeur int mutable][1] | var x = 3 |
[Attribuer une valeur immuable avec un type explicite][1] | val x : Entier = 27 |
[Attribuer une valeur évaluée paresseusement][2] | lazy val y = print("Dormir.") |
[Lier une fonction à un nom][1] | val f = (x: Int) => x * x |
[Lier une fonction à un nom avec un type explicite][1] | val f : Int => Int = (x : Int) => x * x |
[Définir une méthode][1] | def f(x : entier) = x * x |
[Définir une méthode avec un typage explicite][1] | def f(x: Int): Int = x * x |
[Définir une classe][3] | class Hopper(someParam : Int) { ... } |
[Définir un objet][3] | object Hopper(someParam : Int) { ... } |
[Définir un trait][4] | trait Grace { ... } |
[Obtenir le premier élément de la séquence][5] | Seq(1,2,3).head |
[Si commutateur][6] | val result = if(x > 0) "Positive!" |
[Obtenir tous les éléments de la séquence sauf le premier][5] | Seq(1,2,3).tail |
[Parcourir une liste][7] | for { x <- Seq(1,2,3) } print(x) |
[Boucle imbriquée][8] | for { |
[Pour chaque élément de la liste, exécutez la fonction][9] | Liste(1,2,3).foreach { println } |
Imprimer sur sortie standard | print("Ada Lovelace") |
[Trier une liste par ordre alphanumérique][10] | Liste('b','c','a').sorted |
[1] : https://www.wikiod.com/fr/scala/var-val-et-def#Var, Val et Def [2] : https://www.wikiod.com/fr/scala/var-val-et-def#Val paresseux [3] : https://www.wikiod.com/fr/scala/classes-et-objets#Objets singleton et compagnons [4] : https://www.wikiod.com/fr/scala/traits [5] : https://www.wikiod.com/fr/scala/collections [6] : https://www.wikiod.com/fr/scala/si-expressions#Expressions Si de base [7] : https://www.wikiod.com/fr/scala/pour-les-expressions [8] : https://www.wikiod.com/fr/scala/pour-les-expressions#Boucle For imbriquée [9] : https://www.wikiod.com/fr/scala/collections#Pour chaque [10] : https://www.wikiod.com/fr/scala/collections#Trier une liste
Utilisation du REPL Scala
Lorsque vous exécutez scala
dans un terminal sans paramètres supplémentaires, cela ouvre un interpréteur [REPL][1] (Read-Eval-Print Loop) :
nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.
scala>
Le REPL vous permet d’exécuter Scala à la manière d’une feuille de calcul : le contexte d’exécution est préservé et vous pouvez essayer manuellement des commandes sans avoir à créer un programme complet. Par exemple, en tapant val poem = "As halcyons we shall be"
cela ressemblerait à ceci :
scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be
Maintenant, nous pouvons imprimer notre val
:
scala> print(poem)
As halcyons we shall be
Notez que ‘val’ est immuable et ne peut pas être remplacé :
scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
poem = "Brooding on the open sea"
Mais dans le REPL, vous * pouvez * redéfinir un val
(ce qui provoquerait une erreur dans un programme Scala normal, s’il était fait dans la même portée):
scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea
Pour le reste de votre session REPL, cette variable nouvellement définie masquera la variable précédemment définie. Les REPL sont utiles pour voir rapidement comment fonctionnent les objets ou d’autres codes. Toutes les fonctionnalités de Scala sont disponibles : vous pouvez définir des fonctions, des classes, des méthodes, etc.
[1] : https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop