2016-03-04 128 views
0

我是Scala的新手,想弄清楚如何重构下面的代码以避免重复的功能。正如你可以看到那些非常相似,只需要重构为通用代码。Scala重构重复代码

protected lazy val shardNamesSpec: Parser[Seq[String]] = { 
     (ident ^^ {case d => Seq(d)}) | ("(" ~> repsep(ident, ",") <~ ")") ^^ { 
      case i => i 
     } 
     } 

    protected lazy val shardTypesSpec: Parser[Seq[DataType]] = { 
     (dataType ^^ {case d => Seq(d)}) | ("(" ~> repsep(dataType, ",") <~ ")") ^^ { 
      case dt => dt 
     } 
     } 

回答

3

我想你需要像水木清华如下:

def parseExpr[T](value: Parser[T]): Parser[Seq[T]] = { 
    (value ^^ {case d => Seq(d)}) | ("(" ~> repsep(value, ",") <~ ")") ^^ { 
     case i => i 
    } 

    } 

    protected lazy val shardNamesSpec: Parser[Seq[String]] = parseExpr(ident) 

    protected lazy val shardTypesSpec: Parser[Seq[DataType]] = parseExpr(dataType) 
+0

我只是想你的建议,但我得到的编译错误: “值^^ ......”无法解析符号^^ 无法解析符号| “repsep”无法用这样的签名来解析引用repsep – raf

+0

@Raf Oid是你的代码中编译的那些函数吗? – Rumoku

+0

nope,错误发布在我以前的评论 – raf