scala - 解释这个模式匹配代码

标签 scala

此代码来自 Querying a Dataset with Scala's Pattern Matching :

object & { def unapply[A](a: A) = Some((a, a)) }

"Julie" match {
  case Brothers(_) & Sisters(_) => "Julie has both brother(s) and sister(s)"
  case Siblings(_) => "Julie's siblings are all the same sex"
  case _ => "Julie has no siblings"
}

// => "Julie has both brother(s) and sister(s)"
&如何实际工作?我在任何地方都没有看到用于连接的 bool 测试。这个 Scala 魔法是如何工作的?

最佳答案

方法如下 unapply一般工作:

当你这样做

obj match {case Pattern(foo, bar) => ... }
Pattern.unapply(obj)叫做。这可以返回 None在这种情况下,模式匹配失败,或 Some(x,y)在这种情况下foobar绑定(bind)到xy .

如果不是 Pattern(foo, bar)你做了Pattern(OtherPattern, YetAnotherPatter)然后 x将与模式 OtherPattern 匹配和 y将匹配 YetAnotherPattern .如果所有这些模式匹配成功,则执行匹配主体,否则尝试下一个模式。

当模式的名称不是字母数字,而是一个符号(如 & )时,它使用中缀,即你写 foo & bar而不是 &(foo, bar) .

所以这里&是一个总是返回 Some(a,a) 的模式无论如何a是。所以&总是匹配并将匹配的对象绑定(bind)到它的两个操作数。在代码中,这意味着
obj match {case x & y => ...}

将始终匹配并且两者 xy将具有与 obj 相同的值.

在上面的示例中,这用于将两种不同的模式应用于同一对象。

IE。当你这样做时
obj match { case SomePattern & SomeOtherPattern => ...}`

首先是模式&被申请;被应用。正如我所说,它总是匹配和绑定(bind) obj到它的 LHS 和它的 RHS。那么SomePattern应用于&的 LHS(与 obj 相同)和 SomeOtherPattern应用于&的 RHS(也与 obj 相同)。

所以实际上,您只是将两种模式应用于同一个对象。

关于scala - 解释这个模式匹配代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008271/

相关文章:

Scala 类型投影 : pick an object within a path-dependent trait

scala - Spark : how to zip an RDD with each partition of the other RDD

Scala + Eclipse + WebServer = 一个网络应用

scala - 如何使用 Scala 调度获取 301 重定向中返回的 URL?

Scalaz ·克莱斯利问题

scala - Spray-Json:将 None 序列化为 null

scala - Scala 中的 foreach 和 case 语句放在一起。这个结构叫什么?

scala - 在 scala 中,是否可以从 TypeTag 初始化单例对象?

scala - 一般获取 Scala 类型的 list

scala - 如何在 `getOrElseComplete` 上执行 `Promise` ?