斯卡拉2.8.1如何我摆脱“未因删除”的警告时,模式匹配
我一直在使用的解析器/组合子的QA来编写验收测试,实现了一个非常简单的外部DSL。
最近我加入循环的能力在一组表达式,像这样
sealed trait Expr
...
//insert other case classes extending 'Expr' here
...
case class Repetition(times: Int, expressions: List[Expr]) extends Expr
class TestFixtureParser(....) extends RegexParsers {
val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
case (times: Int) ~ (exprs: List[Expr]) => {
Repetition(times, exprs)
}
}
private val expressions: Parser[List[Expr]] = (repeatParser |
/*insert other Parser[Expr]s '|' together here */ | verifyParser).*
}
建设的时候,我收到了警告warning: non variable type-argument ... is unchecked since it is eliminated by erasure
时,模式匹配。我也尝试使用以下的解压缩。
//Doesn't build with error
/*
error: missing parameter type for expanded function ((x0$2) => x0$2 match {
case $tilde((times @ _), (exprs @ _)) => Repetition(times, exprs)
})
r: ~[Int, List[Expr]] => {
*/
val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
r: ~[Int, List[Expr]] => {
case times ~ exprs =>
Repetition(times, exprs)
}
}
//Actually this does build without warning.
//I am unfortunately using intelliJ and it doesn't like it
val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
repetitions: ~[Int, List[Expr]] => {
val ~(times, exprs) = repetitions
Repetition(times, exprs)
}
}
//Builds but same warning
val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
repetitions => {
val ~(times: Int, exprs: List[Expr]) = repetitions
Repetition(times, exprs)
}
}
有没有人有没有这个警告在一个优雅的方式提取exprs
有什么建议?它的功能是如此。我应该忽略它吗?我讨厌养成忽视警告的习惯。
编辑:答案。这实际上是我首先尝试的,但后来我添加了这些类型,因为intelliJ scala插件无法推断它们。
val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
case times ~ exprs =>
Repetition(times, exprs)
}
我很好奇的是,为什么你的第一个“不构建”的例子不会构建......我认为Scala能够推断case表达式中的类型。你会得到什么错误? – Owen