尝试将String解析为使用“^^”的Object的解析器。例如,以下解析器将playframework中的message.en
行解析为Message对象:
val message = ignoreWhiteSpace ~ messageKey ~ (ignoreWhiteSpace ~ "=" ~ ignoreWhiteSpace) ~ messagePattern ^^ {
case (_ ~ k ~ _ ~ v) => Message(k, v.trim)
}
上述代码中^^
的含义是什么?
答案 0 :(得分:4)
这是在scala.util.parsing.combinator.Parsers.Parser
类型上定义的方法。它的签名是def ^^[U](f: T => U): Parser[U]
(在Parser[T]
的实例上定义。)
如果我们有p
类型的解析器Parser[T]
和类型为f
的函数T => U
,则执行p ^^ f
表示“运行解析器p,如果我们可以用p成功解析,然后使用f将解析后的结果转换为U类型。“如果使用p
进行解析失败,那么我们永远不会调用f
。
[具体答案]
所以...在上面的代码中,如果解析器ignoreWhiteSpace ~ messageKey ~ (ignoreWhiteSpace ~ "=" ~ ignoreWhiteSpace) ~ messagePattern
成功,那么我们将把结果转换为Message
类型! { case (_ ~ k ~ _ ~ v) => Message(k, v.trim) }
是此处的函数(如果您愿意,我们的f
)。
希望这清除它!
PS - 这是doc。