具有隐式类的Scala与隐式转换相结合

时间:2014-04-30 12:35:43

标签: scala parsing playframework-2.0 implicit

尝试添加非回溯〜>和<〜我的解析器基于RegexParsers。

RegexParsers实现implicit def literal(s: String): Parser[String]隐式将字符串转换为解析器[String]

现在我添加:

`object implicits{

       implicit class helper[T](parser  : Parser[T])  { 
           def ~>! [U](q: => Parser[U]): Parser[U] = parser ~! q ^^ {case a ~ b => b} named ("~>!") 
           def <~! [U](q: => Parser[U]): Parser[T] = parser ~! q ^^ {case a ~ b => a} named ("<~!") 
       }  
}

巫婆是我隐含的阶级。

但是我看到了一件奇怪的事情

def groupe : Parser[Group] =  "group(" ~>! identifier <~!  ")"

标识符是解析器

这里我在类参数"group(" ~>! identifier中传递字符串时出错,因为没有隐式,编译器查找〜&gt;!在String中。

但是当它在方法参数identifier <~! ")"中传递时,String-&gt; Parser [String]隐式工作。

它是Scala错误还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

这不是一个错误。问题是要在~>!上解决String,编译器必须链接两个隐式转换:从StringParser以及从Parser到{{1 },这是不允许的。因此,您需要添加从helperString的直接转换:

helper

以及必要时从implicit def stringToHelper(s: String): helper[String] = new helper(literal(s)) Regex