我正在阅读Lihaoyi对其解析器组合器框架的介绍,同时仅了解Scala的基础知识。 我碰到了一条我根本听不懂的话:
val Parsed.Success(2, _) = parse("1+1", expr(_))
来自Java,看起来很奇怪。有人知道它做什么吗? 预先感谢。
https://www.lihaoyi.com/fastparse/
Java相当于什么?
答案 0 :(得分:7)
Scala知道提取器对象-请参见docs.scala-lang.org
它们主要用于模式匹配-请参见docs.scala-lang.org
因此可以与val
s一起使用:
val customer2ID = CustomerID("Nico")
val CustomerID(name) = customer2ID
println(name) // prints Nico
如果解析器不起作用,您的示例将抛出scala.MatchError
。
尝试val Parsed.Success(2, _) = parse("1+2", expr(_))
//应该为3
答案 1 :(得分:3)
其他答案从技术上解释了什么,但是为什么fastparse的作者写
val Parsed.Success(2, _) = parse("1+1", expr(_))
在执行此语句后,在哪里可以使用的意义上实际上没有绑定变量?这种看起来像一个副作用返回单元。我相信作者正在使用这种技术来代替断言
assert(parse("1+1", expr(_)) == Parsed.Success(2, 3))
但是他们想强调的是,他们并不关心index
的{{1}}值,而使用常规的Success[+T](value: T, index: Int)
则无法做到这一点
assert
答案 2 :(得分:2)
函数parse
返回的Parsed[T]
与Success
案例类的提取器(在对象Parsed
内)匹配。
它可以改写为:
parse("1+1", expr(_)) match {
case Parsed.Success(2, _/*index*/) => ???
}
以前的方法很明显,它不是一个详尽的匹配(因此val
模式将引发MatchError
)。
也可以用作波纹管,以更加明确并避免使用MatchError
。
val res: Option[(Int/* value */, Int/* index */)] =
Parsed.Success.unapply(parse("1+2", expr(_)))