3

私は Scala を初めて使用し、その構造をデコードしようとしています。パターン マッチングについて学びました。構文は Java の switch ステートメントに似ています。

val x: Int = Random.nextInt(10)

x match {
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}

このコードは非常に明白で読みやすいです。私はかなり明白で明確な部分関数に出くわしました。

部分関数は、与えられる可能性のあるすべての入力値に対して答えを提供しない関数です。

私が混乱してcaseいるのは、次のような部分関数の本体で使用することです:

val divide2: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 42 / d // WHAT IS THIS ?! 
}

caseがステートメントなしでどのように使用されるか、Scala によってどのように解釈されるか、どのように読み取られるか、メソッドなのか、クラスなのか、それとも別の構成要素なのかがわかりません。ステートメントなしmatchで使用できる他の方法は何ですか?casematch

編集:

私はこのケースをいじってみましたが、まだわかりません。例えば

val SomeFun: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }

これはどのように作動しますか?

これを試すとエラーが発生します

val SomeFun = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }


Error:(29, 17) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?

部分関数以外の場所で使用されている一致のないケースはありますか?

4

3 に答える 3

6

これは、入力パラメーターがケース式と一致する場合にのみ、部分関数が適用されることを意味します。

生成される実際のクラスは次のようなものです。

val divide = new PartialFunction[Int, Int] {
    def apply(x: Int) = 42 / x
    def isDefinedAt(x: Int) = x != 0
}

orElse を使用すると、複数の定義を適用または処理できます。

funcForInt orElse funcForDouble orElse funcForString

素敵な構成?

編集:

val SomeFun: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }

上記は匿名クラス機能を使用しています。変数の型を削除すると、コンパイラが実際には使用できないケース式を含むブロック式が与えられます。

参照: https://www.james-willett.com/scala-anonymous-classes

于 2019-10-16T05:05:55.217 に答える