Ceux auxquels je peux penser sont
Types existentiels
def foo(l: List[Option[_]]) = ...
Paramètres de type plus élevés
case class A[K[_],T](a: K[T])
Variables ignorées
val _ = 5
Paramètres ignorés
List(1, 2, 3) foreach { _ => println("Hi") }
Noms ignorés des types personnels
trait MySeq { _: Seq[_] => }
Motifs génériques
Some(5) match { case Some(_) => println("Yes") }
Motifs génériques dans les interpolations
"abc" match { case s"a$_c" => }
Caractère générique de séquence dans les modèles
C(1, 2, 3) match { case C(vs @ _*) => vs.foreach(f(_)) }
Importations génériques
import java.util._
Masquer les importations
import java.util.{ArrayList => _, _}
Joindre des lettres aux opérateurs
def bang_!(x: Int) = 5
Opérateurs d'affectation
def foo_=(x: Int) { ... }
Syntaxe de l'espace réservé
List(1, 2, 3) map (_ + 2)
Valeurs de méthode
List(1, 2, 3) foreach println _
Conversion de paramètres d'appel par nom en fonctions
def toFunction(callByName: => Int): () => Int = callByName _
Initialiseur par défaut
var x: String = _ // unloved syntax may be eliminated
Il y en a peut-être d'autres que j'ai oubliés!
Exemple montrant pourquoi foo(_)
et foo _
sont différents:
Cet exemple vient de 0__ :
trait PlaceholderExample {
def process[A](f: A => Unit)
val set: Set[_ => Unit]
set.foreach(process _) // Error
set.foreach(process(_)) // No Error
}
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 car A
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.