2011-08-18 60 views
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) 

main方法中的require将失败。
但是这一次是确定Scala替代案例匹配不同类型的提取值的语法

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

那是Scala语言本身或我的限制,以错误的方式

回答

7

这......都正在做。

你可以看看如何在Scala specification§8.1.3中模式粘合剂的行为。它表示模式为[email protected]

变量x的类型是模式p的静态类型T.

在你的情况,模式pIntValue(_) | BooleanValue(_)。由于IntValueBooleanValue未应用方法都需要一个字符串,因此您的模式的静态类型为String,因此,x的类型为String

在第二种情况下,值从布尔值中提取并具有正确的类型。

不幸的是,scala不支持提取器模式的替代方案,因此您必须坚持使用第二个版本。

+0

对于我的用例,有没有更好的解决方案?我觉得我正在用错误的方式使用提取器? – jilen

+0

这里没有你的提取器的用法是正确的。但你的比赛并不全面。此外,推断的值的类型是任何,它可能是不适当的,取决于上下文。 – Nicolas