J'ai jeté un coup d'œil à la liste des sondages effectués sur scala-lang.org et j'ai remarqué une curieuse question: " Pouvez-vous nommer toutes les utilisations de" _ "? ". Peut tu? Si oui, veuillez le faire ici. Des exemples explicatifs sont appréciés.
540
Réponses:
Ceux auxquels je peux penser sont
Types existentiels
Paramètres de type plus élevés
Variables ignorées
Paramètres ignorés
Noms ignorés des types personnels
Motifs génériques
Motifs génériques dans les interpolations
Caractère générique de séquence dans les modèles
Importations génériques
Masquer les importations
Joindre des lettres aux opérateurs
Opérateurs d'affectation
Syntaxe de l'espace réservé
Valeurs de méthode
Conversion de paramètres d'appel par nom en fonctions
Initialiseur par défaut
Il y en a peut-être d'autres que j'ai oubliés!
Exemple montrant pourquoi
foo(_)
etfoo _
sont différents:Cet exemple vient de 0__ :
Dans le premier cas,
process _
représente une méthode; Scala prend la méthode polymorphe et tente de la rendre monomorphe en remplissant le paramètre type, mais se rend compte qu'il n'y a pas de type qui puisse être rempli carA
cela donnera le type(_ => Unit) => ?
(Existential_
n'est pas un type).Dans le deuxième cas,
process(_)
est un lambda; lors de l'écriture d'un lambda sans type d'argument explicite, Scala déduit le type de l'argument qui l'foreach
attend et_ => Unit
est un type (alors que ce_
n'est pas le cas), il peut donc être substitué et déduit.C'est peut-être le piège le plus délicat de Scala que j'aie jamais rencontré.
Notez que cet exemple se compile en 2.13. Ignorez-le comme s'il avait été attribué au trait de soulignement.
la source
val x: Any = _
println _
etprintln(_)
sont différents. Vous pouvez voir cela par exemple en ce qu'ils gèrent les types existentiels et polymorphes légèrement différemment. Viendra avec un exemple dans un peu.De (mon entrée) dans la FAQ , que je ne garantis certainement pas d'être complète (j'ai ajouté deux entrées il y a seulement deux jours):
Cela fait également partie de cette question .
la source
var i: Int = _
ou le cas spécial de la correspondance de motifsval (a, _) = (1, 2)
ou le cas spécial de val jetéfor (_ <- 1 to 10) doIt()
def f: T; def f_=(t: T)
combo pour créer un membre f mutable._
sur les noms de méthode, c'est de la triche. Mais bon, ok. J'espère juste que quelqu'un d'autre mettra à jour la FAQ ... :-)Une excellente explication des utilisations du trait de soulignement est Scala _ [underscore] magic .
Exemples:
Dans Scala,
_
agit de la même manière*
qu'en Java lors de l'importation de packages.Dans Scala, un getter et un setter seront définis implicitement pour toutes les variables non privées d'un objet. Le nom du getter est identique au nom de la variable et
_=
est ajouté pour le nom du setter.Usage:
Si vous essayez d'affecter une fonction à une nouvelle variable, la fonction sera invoquée et le résultat sera affecté à la variable. Cette confusion se produit en raison des accolades facultatives pour l'appel de méthode. Nous devons utiliser _ après le nom de la fonction pour l'assigner à une autre variable.
la source
List(1,2,3,4,5).foreach(print(_))
c'est beaucoup plus lisible à faireList(1,2,3,4,5).foreach(print)
, vous n'avez même pas vraiment besoin du soulignement du tout, mais je suppose que c'est juste une question de styleIl y a un usage que je peux voir que tout le monde ici semble avoir oublié de lister ...
Plutôt que de faire cela:
Vous pouvez simplement faire ceci:
la source
n => n
Voici quelques autres exemples où
_
est utilisé:Dans tous les exemples ci-dessus, un trait de soulignement représente un élément de la liste (pour réduire le premier trait de soulignement représente l'accumulateur)
la source
Outre les usages mentionnés par JAiro, j'aime bien celui-ci:
Si quelqu'un a besoin de toutes les propriétés de connexion, il peut faire:
Si vous n'avez besoin que d'un hôte et d'un port, vous pouvez faire:
la source
Il existe un exemple spécifique d'utilisation de "_":
peut être égal à:
L'application de «_» dans certains scénarios se convertira automatiquement en «(x $ n) => x $ n»
la source