1

エクストラクタが を返すときに、変数を @ スタイルでバインドできないのはなぜOption[<Type>]ですか? つまり、これは機能しません:

object IsUpperCase {
  def unapply(s: String): Option[String] = {
    if (s.toUpperCase() == s) {
      Some(s)
    } else {
      None
    }
  }
}

val s = "DuDu@qwadasd.ru"
s match {
  case u @ IsUpperCase() => println("gotcha!") // what? "wrong number of arguments for object IsUpperCase"?
  case _ => 
}

しかし、これは機能します!

val s = "DuDu@qwadasd.ru"
s match {
  case IsUpperCase(u) => println("gotcha!")
  case _ => 
}

一方、次のようにIsUpperCase見える場合:

object IsUpperCase {
  def unapply(s: String): Boolean = {
    return s.toUpperCase() == s
  }
}

次に、最初の例は機能しますが、2 番目の例は機能しません! なぜこのようになっているのですか?

4

2 に答える 2

8

何?「オブジェクト IsUpperCase の引数の数が間違っています」?

case u @ IsUpperCase() => println("gotcha!")

はい、そうです。の戻り値の型はunapplyですOption[String]。これは、 のパターン マッチが次のようにパラメーターを受け入れIsUpperCase なければならないことを意味します。

case u @ IsUpperCase(_) => println("gotcha!") // I don't care about the parameter

最初のunapplyパターンに適合する定義は次のとおりです。

object IsUpperCase {
  def unapply(s: String): Boolean = s.toUpperCase() == s
}

これは、 に対するパターン マッチに使用できますIsUpperCase()

于 2012-07-01T17:49:19.057 に答える
5

case u @ IsUpperCase(v) =>最初の例ではorのようなものを書く必要があるためcase u @ IsUpperCase(_) =>、これは「一致し、成功した場合は元の文字列を" にIsUpperCase(v)バインドする」ことを意味します。u

于 2012-07-01T17:33:49.590 に答える