スカラ 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)
}