В вашем блоке match
, nuc
является переменной шаблона и не ссылается на nuc
во вложенной области видимости. Это делает регистр по умолчанию недоступным, потому что простой шаблон nuc
будет соответствовать чему угодно.
Пустая пара скобок в nuc
заставит синтаксический сахар работать и вызовет метод unapplySeq
в регулярном выражении:
myString match {
case nuc() => println("dna")
case _ => println("not dna")
}
Один из способов избежать этой ловушки - переименовать nuc
в Nuc
. Начиная с заглавной буквы, он становится стабильным идентификатором, так что он ссылается на Nuc
во входящей области, а не обрабатывается компилятором как переменная шаблона.
val Nuc = "[ACGT]+".r
myString match {
case Nuc => println("dna")
case _ => println("not dna")
}
Выше будет напечатано "not dna"
, потому что здесь мы просто сравниваем Nuc
с myString
, и они не равны. Это ошибка, но, возможно, менее запутанная!
Добавление скобок будет иметь желаемый эффект и в этом случае:
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))