【问题标题】:Scala with implicit class coupled with implicit conversions具有隐式类和隐式转换的 Scala
【发布时间】:2014-04-30 21:24:52
【问题描述】:

尝试将非回溯 ~> 和

RegexParsers 实现 implicit def literal(s: String): Parser[String] 女巫转换隐含的字符串到 Parser[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(" ~&gt;! identifier 中传递字符串时出现错误,因为没有进行隐式并且编译器会查找〜>!在字符串中。

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

这是一个 Scala 错误还是我错过了什么?

【问题讨论】:

    标签: scala parsing playframework-2.0 implicit


    【解决方案1】:

    这不是错误。问题是,要在String 上解析~&gt;!,编译器必须链接两个隐式转换:从StringParser 和从Parserhelper,这是不允许的。所以你需要添加一个从Stringhelper的直接转换:

    implicit def stringToHelper(s: String): helper[String] = new helper(literal(s))
    

    如果需要,还可以从Regexhelper

    【讨论】:

    • 好的,谢谢,对于方法参数,这只是一次转换。为什么不允许?我觉得这是一种挫败感。在这种情况下添加直接转换工作,但在我们不知道有多少转换的情况下,这将成为一个真正的问题。谢谢你的回答znd对不起我的英语
    • 因为如果允许 1) 编译器在停止搜索之前会花费更多时间搜索隐式并说该方法确实不可用(并且构建时间已经够糟糕了); 2)你经常会更频繁地得到模棱两可的隐含。
    猜你喜欢
    • 2017-08-04
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多