此代码来自 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)
在这种情况下foo
和 bar
绑定(bind)到x
和 y
.如果不是
Pattern(foo, bar)
你做了Pattern(OtherPattern, YetAnotherPatter)
然后 x
将与模式 OtherPattern
匹配和 y
将匹配 YetAnotherPattern
.如果所有这些模式匹配成功,则执行匹配主体,否则尝试下一个模式。当模式的名称不是字母数字,而是一个符号(如
&
)时,它使用中缀,即你写 foo & bar
而不是 &(foo, bar)
.所以这里
&
是一个总是返回 Some(a,a)
的模式无论如何a
是。所以&
总是匹配并将匹配的对象绑定(bind)到它的两个操作数。在代码中,这意味着obj match {case x & y => ...}
将始终匹配并且两者
x
和 y
将具有与 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/