3
object NoSense {
   def main(args: Array[String]) {
      val value = "true" match {
         case value @ (IntValue(_) | BooleanValue(_)) => value
      }
      require(value == true)
   }
}

class Value[T](val regex: Regex, convent: String => T) {
   def unapply(value: String): Option[T] = value match {
      case regex(value, _*) => Some(convent(value))
      case _ => None
   }
}
object IntValue extends Value[Int]("[0-9]+".r, _.toInt)
object BooleanValue extends Value[Boolean]("((true)|(false))".r, _.toBoolean)

メソッドのrequiremain失敗します。
しかし、これは大丈夫です

def main(args: Array[String]) {
      val value = "true" match {
         case IntValue(value) => value
         case BooleanValue(value) => value
      }
      require(value == true)
   }

それはscala言語自体の制限ですか、それとも私のやり方が間違っていますか

4

1 に答える 1

8

それは...両方です。

Scala 仕様§8.1.3でパターン バインダーがどのように動作するかを調べることができます。それはパターンでそれを言いますx@p:

変数 x の型は、パターン p の静的型 T です。

あなたの場合、パターンpIntValue(_) | BooleanValue(_). asIntValueBooleanValueunapply-method はどちらも文字列を必要とするため、パターンの静的タイプはis です。Stringしたがって、のタイプはxisStringです。

2 番目のケースでは、値は BooleanValue から抽出され、適切な型になります。

残念ながら、scala は抽出パターンの代替をサポートしていないため、2 番目のバージョンに固執する必要があります。

于 2011-08-18T11:11:32.980 に答える