2 votes

Scala début illégal d'une expression simple avec la fonction postfixe

Je m'amuse à appeler une commande externe depuis Scala. Voici un exemple dépouillé de ce sur quoi je travaille :

import scala.sys.process._

object Testing {
    def main(args: Array[String]) {
        val command = "ls"
        val result = command!
        if (result != 0) {    // <---- illegal start of simple expression
            println("Error")
            return
        }
    }
}

J'obtiens une erreur de compilation : illegal start of simple expression pour la ligne avec le if déclaration. Je peux le corriger avec une nouvelle ligne :

val result = command!
                      // Add a line
if (result != 0) { 

Je soupçonne que cela a quelque chose à voir avec le ! mais j'ai cru comprendre que les lignes/espaces blancs superflus ne devraient pas faire de différence pour le compilateur.

2voto

ale64bit Points 4341

Vous devez activer explicitement les expressions postfix :

1) Importer le drapeau localement : import scala.language.postfixOps

2) ou en ajoutant le drapeau au projet lui-même : scalacOptions += "-language:postfixOps"

Le lien ci-dessus dans le commentaire de @Łukasz contient beaucoup d'infos sur cette fonctionnalité. Voir aussi http://docs.scala-lang.org/style/method-invocation.html dans la section "Notation des suffixes" pour votre cas d'utilisation exact.

EDITAR: peut-être que ce n'était pas assez clair, mais comme @Łukasz l'a souligné dans les commentaires, importer/activer les expressions postfix ne rend pas votre code compilable. Cela évite simplement l'avertissement du compilateur. Votre code ne compilera pas parce que les points-virgules sont optionnels et que le compilateur traite les expressions postfixes comme des éléments de base. ! comme infixe, et donc en prenant des éléments de la ligne suivante pour les expressions. C'est exactement ce que dit la documentation dans le lien ci-dessus avec exactement ce même exemple :

Ce style n'est pas sûr et ne doit pas être utilisé. Puisque les points-virgules sont optionnels, le compilateur essaiera de les traiter comme des méthodes il le peut, en prenant potentiellement un terme de la ligne suivante.

names toList
val answer = 42        // will not compile!

Au mieux, cela peut entraîner des erreurs de compilation inattendues, et heureusement et au pire, un code défectueux compilé avec bonheur. Bien que cette syntaxe soit utilisée par certains DSLs, elle doit être considérée comme dépréciée et évitée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X