5

パターン マッチング中にクラス インスタンスのフィールド ( val) を使用できます。

class A {
  val foo = 37
  def bar = 42
}

def patmat1(a: A, x: Int) {
  x match {
    case a.foo => println("a.foo")
    case _     => println("not a.foo")
  }
}

patmat1(new A, 37) // => a.foo
patmat1(new A, 42) // => not a.foo

そして、なぜdef類似して使用できないのだろうか?

def patmat2(a: A, x: Int) {
  x match {
    case a.bar => println("a.bar")
    //     ^ error: stable identifier required, but a.bar found.
    case _     => println("not a.bar")
  }
}

valdefはほとんど交換可能だと思いました。

4

2 に答える 2

2

参照によると、2番目のケースは有効なパターンではありません。val fooこれは安定した識別子パターン§ 8.1.5であるため機能します。これは基本的に、かどうかをチェックすることを意味しますx == a.foo

2番目のケースは、有効なパターンでa.barはなく(識別子ではなく宣言であるため)、エラーになります。

1つの慣用的な方法は次のとおりです。

def patmat1(a: A, x: Int) {
  x match {
    case i if a.bar == x => println("a.foo")
    case _     => println("not a.foo")
  }
} 
于 2013-09-16T08:22:48.243 に答える
0

case ステートメントの左半分の最初の部分は、オブジェクトを分解するか、それを定数値に一致させることだと思います。たとえば、次のようになります。

val animal: Animal = Dog("butch",4)

animal match {
  case _: Dog => println("bow-wow")
  case _: Cat => println("meow")
}

定数と比較したい場合は、case ステートメントの主要部分で行うことができます。

secretConstant match {
  case Math.PI => println("I'm a PI")
  case Math.E  +> println("I'm an E")
  case _ => println("I don't know what I am")
}

ifただし、計算値と比較する場合は、case ステートメントの一部に含める必要があります。

tomsWeddingDate match {
  case date: LocalDate if date < LocalDate.now() => println("phew, I still have time to buy a gift.")
  case _ => println("Oops, I guess I need to send a belated card")
}
于 2013-09-16T08:41:08.193 に答える