{val Class.Something(2,_)= doSomething()”是什么意思?

时间:2019-07-24 11:25:36

标签: scala pattern-matching

我正在阅读Lihaoyi对其解析器组合器框架的介绍,同时仅了解Scala的基础知识。 我碰到了一条我根本听不懂的话:

val Parsed.Success(2, _) = parse("1+1", expr(_))

来自Java,看起来很奇怪。有人知道它做什么吗? 预先感谢。

https://www.lihaoyi.com/fastparse/

Java相当于什么?

3 个答案:

答案 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(_)))