编辑: AA003 2019-07-16

10 object #:: { def unapply[A](xs: Stream[A]): Option[(A, Stream[A]) = if (xs.isEmpty) None else Some((xs.head, xs.tail)) } 如果给定的流是空的,提取器就直接返回 None . 因此, case head #:: tail 就不会匹配任何空的流. 否则,就会返回一个 Tuple2 ,其第一个元素是 流的头,第二个元素是流的尾,尾本身又是一个流. 这样, case head #:: tail 就会匹配有一个或多个元素的流. 如果只有一个元素, tail 就会被绑定 成空流. 为了理解流提取器是怎么在模式匹配中工作的,重写上面的例子,把它从中缀写法 转成普通的提取器模式写法: val xs =

58 #::

43 #::

93 #:: Stream.empty xs match { case #::(first, #::(second,first - second case _ =>

-1 } 首先为传递给模式匹配的初始流 xs 调用提取器. 由于提取器返回 Some(xs.head, xs.tail) ,从而 first 会绑定成 58, xs 的尾会继续传 递给提取器,提取器再一次被调用,返回首和尾, second 就被绑定成

43 , 而尾就绑定到通配符 _ ,被直接扔掉了. 使用提取器 那到底该在什么时候使用、怎么使用自定义的提取器呢?尤其考虑到,使用样例类 就能自动获得可用的提取器. 一些人指出,使用样例类、对样例类进行模式匹配打破了封装, 耦合了匹配数据和 其具体实现的方式,这种批评通常是从面向对象的角度出发的. 如果想用 Scala 进 行函数式编程,将样例类当作只包含纯数据(不包含行为)的 代数数据类型 ,那 它非常适合. 提取器

11 通常,只有当从无法掌控的类型中提取数据,或者是需........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题