私は見てみましたリスト実施された調査のscala.org よりそして、興味深い疑問に気づきました。「「_」の用途をすべて挙げることができますか?「できますか?できる場合は、ここでそうしてください。説明的な例があるとありがたいです。」
ベストアンサー1
私が思いつくのは
存在型
def foo(l: List[Option[_]]) = ...
より高次の型パラメータ
case class A[K[_],T](a: K[T])
無視された変数
val _ = 5
無視されたパラメータ
List(1, 2, 3) foreach { _ => println("Hi") }
無視される自己型の名前
trait MySeq { _: Seq[_] => }
ワイルドカードパターン
Some(5) match { case Some(_) => println("Yes") }
補間におけるワイルドカードパターン
"abc" match { case s"a$_c" => }
パターン内のシーケンスワイルドカード
C(1, 2, 3) match { case C(vs @ _*) => vs.foreach(f(_)) }
ワイルドカードインポート
import java.util._
インポートの非表示
import java.util.{ArrayList => _, _}
文字を演算子に結合する
def bang_!(x: Int) = 5
代入演算子
def foo_=(x: Int) { ... }
プレースホルダー構文
List(1, 2, 3) map (_ + 2)
メソッド値
List(1, 2, 3) foreach println _
名前による呼び出しパラメータを関数に変換する
def toFunction(callByName: => Int): () => Int = callByName _
デフォルトの初期化子
var x: String = _ // unloved syntax may be eliminated
他にも忘れているものがあるかもしれません!
foo(_)
と がfoo _
異なる理由を示す例:
この例0__から来ている:
trait PlaceholderExample {
def process[A](f: A => Unit)
val set: Set[_ => Unit]
set.foreach(process _) // Error
set.foreach(process(_)) // No Error
}
最初のケースでは、メソッドを表します。Scala は多態的メソッドを受け取り、型パラメータを埋めることで単態的にしようとしますが、型を与えるために埋めることができる型process _
がないことを認識します(Existential は型ではありません)。A
(_ => Unit) => ?
_
2 番目のケースでは、process(_)
はラムダです。明示的な引数の型を持たないラムダを記述する場合、Scala はforeach
期待される引数から型を推論し、は型_ => Unit
です(単純な場合は型_
ではありません)。そのため、置換して推論することができます。
これはおそらく私がこれまで遭遇した Scala の最も厄介な落とし穴でしょう。
この例は 2.13 でコンパイルされることに注意してください。アンダースコアに割り当てられたものとして無視してください。