Scala具有支持模式匹配中的析取的语言功能('Pattern Alternatives'):
x match {
case _: String | _: Int =>
case _ =>
}
Run Code Online (Sandbox Code Playgroud)
但是,如果仔细检查满足PatternA 和 PatternB(连接),我经常需要触发一个动作.
我创建了一个模式组合器'&&',它增加了这个功能.三条小线条让我想起为什么我爱斯卡拉!
// Splitter to apply two pattern matches on the same scrutiny.
object && {
def unapply[A](a: A) = Some((a, a))
}
// Extractor object matching first character.
object StartsWith {
def unapply(s: String) = s.headOption
}
// Extractor object matching last character.
object EndsWith {
def unapply(s: String) = s.reverse.headOption
}
// Extractor object matching length.
object Length {
def …Run Code Online (Sandbox Code Playgroud) Play2的anorm有一个很好的DSL结果解析器:
case class User(id:Pk[String], name:String)
object User {
val parser = get[String]("id") ~ get[String]("name") map {
case id ~ name => User(id,name)
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白这部分case id ~ name,为什么~两个变量之间可以存在?
我case通常认为:
case id => _
case (a,b) => _
case Array(a, _*) => _
Run Code Online (Sandbox Code Playgroud)
但我没有看到case id ~ name.
来源~是:https://github.com/playframework/Play20/blob/master/framework/src/anorm/src/main/scala/SqlParser.scala#L49
它定义了一个案例类~:
case class ~[+A, +B](_1:A, _2:B)
Run Code Online (Sandbox Code Playgroud)
我写了一个简单的测试:
case class ~[+A, +B](_1:A, _2:B)
new ~("a","b") match {
case x …Run Code Online (Sandbox Code Playgroud)