2011-10-25 41 views
7

匹配作为后续this问题正则表达式格局,斯卡拉第二部分

下面是一些编译和运行正常,使用捕捉代码。

val myString = "ACATCGTAGCTGCTAGCTG" 

val nucCap = "([ACTG]+)".r 

myString match { 
    case nucCap(myNuc) => println("dna:"+myNuc) 
    case _ => println("not dna") 
} 

>scala scalaTest.scala 
dna:ACATCGTAGCTGCTAGCTG 

这里是更简单的代码,没有捕获,不编译。

val myString = "ACATCGTAGCTGCTAGCTG" 

val nuc = "[ACGT]+".r 

myString match { 
    case nuc => println("dna") 
    case _ => println("not dna") 
} 

>scala scalaTest.scala 
scalaTest.scala:7: error: unreachable code 

似乎匹配应该返回布尔值,无论是否使用捕获。 这是怎么回事?

回答

8

在您的match区块中,nuc是一个模式变量,并且在封闭范围内没有引用nuc。这使得默认情况下无法访问,因为简单模式nuc将匹配任何内容。

一对空括号对nuc将使语法糖工作,并调用unapplySeq方法的正则表达式:为了避免这一缺陷

myString match { 
    case nuc() => println("dna") 
    case _ => println("not dna") 
} 

一种方法是重命名nucNuc。以大写字母开头使其成为一个稳定的标识符,以便它引用封闭作用域中的Nuc,而不是被编译器视为模式变量。

val Nuc = "[ACGT]+".r 
myString match { 
    case Nuc => println("dna") 
    case _ => println("not dna") 
} 

上面会打印"not dna",因为在这里我们简单地比较NucmyString,他们是不相等的。这是一个错误,但也许不那么令人困惑!

添加括号将在这种情况下也预期的效果:顺便问一下

myString match { 
    case Nuc() => println("dna") 
    case _ => println("not dna") 
} 
// prints "dna" 

,它不是被返回一个布尔值,而是一个Option[List[String]]

scala> nuc.unapplySeq(myString) 
res17: Option[List[String]] = Some(List()) 
scala> nucCap.unapplySeq(myString) 
res18: Option[List[String]] = Some(List(ACATCGTAGCTGCTAGCTG)) 
+0

不是挑剔的,但为什么它说默认情况是不可达的(case _ => println(“不是dna”)) –

+0

我错过了我的答案 - 现在更新它来解释这一点。 –