【Scala】模式匹配和样本类

本文详细介绍了Scala中的模式匹配,包括match表达式的用法、各种模式的种类,如常量模式、变量模式、构造器模式等。此外,文章还深入探讨了样本类的特点,如自动添加工厂方法、toString等实现。同时提到了封闭类的概念,以及Option类型在处理可选值时的作用。通过模式匹配处理Option值的方式展示了Scala语言的优雅之处。
摘要由CSDN通过智能技术生成

模式匹配

要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式是数据结构上的,这个模式用于描述一个结构的组成。

我们很容易联想到“正则表达”里的模式,不错,这个pattern和正则里的pattern相似,不过适用范围更广,可以针对各种类型的数据结构,不像正则表达只是针对字符串。比如正则表达式里 “^A.*” 这个pattern 表示以A开头、后续一个或多个字符组成的字符串;List(“A”, _, _*) 也是个pattern,表示第一个元素是”A”,后续一个或多个元素的List。

match表达式的不同

match表达式可以看做是Java风格switch的泛化。当每个模式都是常量并且最后一个模式可以是通配的时候,Java风格的switch可以被自然地表达为match表达式。但有三点不同需要牢记:

1. match表达式始终以值作为结果,这是Scala表达式的特点
2. Scala的备选项表达式永远不会意外掉入到下一个分支。在C或其他类C语言中,每个分支末尾要显式使用break语句来退出switch。
3. 如果没有模式匹配,MatchError异常会被抛出。这意味着你必须始终确信所有的情况都考虑到,或者至少意味着可以添加一个默认情况什么事都不做

模式的种类

1、通配模式(_)匹配任意对象,它被用作默认的“全匹配(catch-all)”的备选项
2、常量模型仅匹配自身,任何字面量都可以用作常量
3、变量模式类似于通配模式,它可以匹配任意对象。与通配符(_)不同的是,Scala把变量绑定在匹配的对象上。

//这里,如果expr非零
//somethingElse变量将绑定对象expr,结果输出expr的值
expr match {
    case 0 => "zero"
    case somethingElse => "not zero: " + somethingElse
}

4、构造器模式提供了深度匹配(deep match),如果备选项是样本类,那么构造器模式首先检查对象是否为该备选项的样本类实例,然后检查对象的构造器参数是否符合额外提供的模式。
构造器模式不只检查顶层对象是否一致,还会检查对象的内容是否匹配内层的模式。由于额外的模式自身可以形成构造器模式,因此可以使用它们检查到对象内部的任意深度。

//某个商店售卖物品,有时物品捆绑在一起打折出售
abstract class Item
case class Product(description: String, price: Double) ex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值