我有关于“::”案例类两个问题。
::可以用作
case head :: tail => ...
它是如何工作的? 意思是,那是什么斯卡拉使用,以配合::案例类List实例究竟流向何处? 既然我有一个MyClass类,与运营商运,我可以创造一个案例类名为OP,我可以为使用:
case foo op bar => ....
?
我有关于“::”案例类两个问题。
::可以用作
case head :: tail => ...
它是如何工作的? 意思是,那是什么斯卡拉使用,以配合::案例类List实例究竟流向何处? 既然我有一个MyClass类,与运营商运,我可以创造一个案例类名为OP,我可以为使用:
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
它在301页的详细规划Scala中 ,关于模式匹配List
秒。
的“缺点”模式
x :: xs
是一个中缀操作模式的一种特殊情况。 你已知道,知道,当一个表达式看出,中缀操作相当于一个方法调用。 的模式,规则是不同的:当作为图案看到的那样,中缀操作,诸如p op q
相当于op(p, q)
也就是说,中缀算子op
进行处理作为构造图案。 特别地,一个缺点图案如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!"
}
提取器必须返回一个选件,它包含两个解构元素的元组。
通过eed3si9n引用的文字是在页码。 331的“在Scala编程”的PDF版(第1版)