Scala におけるアンダースコアの用途は何ですか? 質問する

Scala におけるアンダースコアの用途は何ですか? 質問する

私は見てみましたリスト実施された調査の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 でコンパイルされることに注意してください。アンダースコアに割り当てられたものとして無視してください。

おすすめ記事