我有两个关于'::' case类的问题。
'::'可以用作
case head :: tail => ...
它是如何工作的?也就是说,Scala使用什么流程来将List实例与:: case类匹配?假设我有一个名为MyClass的类,其中包含操作符op,我能否创建一个名为op的case类,以便我可以像这样使用:
case foo op bar => ....
?
我有两个关于'::' case类的问题。
'::'可以用作
case head :: tail => ...
它是如何工作的?也就是说,Scala使用什么流程来将List实例与:: case类匹配?假设我有一个名为MyClass的类,其中包含操作符op,我能否创建一个名为op的case类,以便我可以像这样使用:
case foo op bar => ....
?
scala> abstract class Stack {
| def push(n :Int):Stack
| }
defined class Stack
scala> final case class push(st :Stack,hd :Int) extends Stack {
| override def push(n :Int):Stack = new push(this,n)
| }
defined class push
scala> object NullStack extends Stack {
| override def push(n :Int):Stack = new push(null,n)
| }
defined module NullStack
scala> val s = NullStack.push(1).push(2)
s: Stack = push(push(null,1),2)
scala> def test(s :Stack) = s match { case st push i => println(st +"push " + i) }
test: (Stack)Unit
scala> test(s)
push(null,1)push 2
这在《Scala编程》的第301页详细说明了,涉及到对List
进行模式匹配。
“cons” 模式
x :: xs
是中缀操作模式的一种特殊情况。 您已经知道,当视为表达式时,中缀操作等同于方法调用。对于模式,规则 是不同的:当作为模式看待时,中缀操作如p op q
等同于op(p, q)
。 也就是说,中缀运算符op
被视为构造函数模式。 特别地,cons 模式如x :: xs
被视为::(x, xs)
。 这暗示着应该有一个名为::
的类与该模式构造函数对应。确实存在这样的类。 它被命名为scala.::
,正是构建非空列表的类。
object ::> {def unapply[A] (l: List[A]) = Some( (l.init, l.last) )}
List(1, 2, 3) match {
case _ ::> last => println(last)
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7, 8) ::> 9 => "woah!"
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7) ::> 8 ::> 9 => "w00t!"
}