Scala的case类问题(scala case classes questions)

2019-08-17 06:59发布

我有关于“::”案例类两个问题。

::可以用作

case head :: tail => ...

它是如何工作的? 意思是,那是什么斯卡拉使用,以配合::案例类List实例究竟流向何处? 既然我有一个MyClass类,与运营商运,我可以创造一个案例类名为OP,我可以为使用:

case foo op bar => ....

Answer 1:

     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


Answer 2:

它在301页的详细规划Scala中 ,关于模式匹配List秒。

的“缺点”模式x :: xs是一个中缀操作模式的一种特殊情况。 你已知道,知道,当一个表达式看出,中缀操作相当于一个方法调用。 的模式,规则是不同的:当作为图案看到的那样,中缀操作,诸如p op q相当于op(p, q) 也就是说,中缀算子op进行处理作为构造图案。 特别地,一个缺点图案如x :: xs被视为::(x, xs) 这暗示,应该有一个名为类::相对应的模式构造。 事实上,有这样一类。 它被命名为scala.::和正是建立非空列表的类。



Answer 3:

其实,事实::是的情况下,类只是答案的一半。 这个工作在模式匹配的原因是,存在用于对象::,被定义的情况下,类时自动生成的提取器 。 方便的是,::。不应用返回一个列表,因为::扩展列表。 如果你想使用相同的伎俩名单,但是,你将不能够扩展列表,因为它是最后的 。 你可以做的是定义一个具有相应取消应用方法,具有预期收益签名的对象。 例如,在列表的最后一个元素匹配,你可以这样做:

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!"
}

提取器必须返回一个选件,它包含两个解构元素的元组。



Answer 4:

通过eed3si9n引用的文字是在页码。 331的“在Scala编程”的PDF版(第1版)



文章来源: scala case classes questions
标签: class scala case