优秀的编程知识分享平台

网站首页 > 技术文章 正文

什么是scala的模式匹配?(scala模式匹配 类型)

nanyue 2024-07-26 15:41:29 技术文章 7 ℃

理解scala的模式匹配首先需要理解“模式匹配是什么”?

这里的模式不是指的设计模式中的模式的意思,而是指一定的规则,跟“正则表达式”类似。

维基字典:模式匹配,也称为串匹配(string matching, pattern matching),就是给定一组特定的字符串集合P,对于任意的一个字符串T,找出P中的字符串在T中的所有出现位置。我们称P为模式串集合,称P中的元素为模式串(或关键词),称T为文本。字符串中的字符都取自一个有限的符号集合Σ ,简称字母表或字符集。

比喻一下就是从一个拼图里找到与另一个拼图中存在的匹配图片。

往宽泛了讲,就是给定一个匹配的模式规则,凡是符合规则的就算是匹配上了。

这些规则在scala中都有以下几种:

1.常量模式constant patterns,包含常量字面量和常量变量

 常量字面量
 scala> val a = 1000
 a: Int = 1000
 scala> a match {case 1000 => println("match")}
 match
 
 常量变量
 scala> val A="a"
 A: String = a
 scala> def foo(a:String){a match {case A => println("match")}}
 foo: (a: String)Unit
 scala> foo("a")
 match
 
 

2.通配符模式wildcard patterns

通配符用下划线表示:"_" ,可以理解成一个特殊的变量或占位符。

scala> Array(1,2,3) match{case Array(1,2,_) => println("ok")}
ok

上边的通配符_表示可以匹配任一类型,只要前边匹配上就可以。

3.类型模式type patterns

类型模式匹配跟java的instanceOf效果一样,判断是否是同一种类型。

scala> a match{case _:Int => println("match")}
match

4.构造器模式constructor patterns

我们来做一个较为复杂的测试,构造一个二叉树结构来体现一下构造器模式匹配的威力,在命令行中输入:paste

scala> :paste
// Entering paste mode (ctrl-D to finish)
//定义抽象节点
trait Node 
//具体的节点实现,构造函数有两个子节点
case class TreeNode(V:String,left:Node,right:Node) extends Node 
//定义Tree构造参数是root根节点
case class Tree(root:TreeNode)
// Exiting paste mode, now interpreting.
defined trait Node
defined class TreeNode
defined class Tree

接来下构造一个根节点含有左右两个子节点的树Tree

scala> val tree = Tree(TreeNode("root",TreeNode("left",null,null),TreeNode("righ
t",null,null)))
tree: Tree = Tree(TreeNode(root,TreeNode(left,null,null),TreeNode(right,null,nul
l)))

然后我想得到匹配一棵树的左节点为“left”右节点为“right”且右节点没有子节点的树结构的时候我们可以这么写:

scala> tree.root match{case TreeNode(_,TreeNode("left",_,_),TreeNode("right",nul
l,null)) => println("match")}
match

这样的结果使用一行代码较为简单地就实现了,如果用java可能需要更多的代码量。

5.变量绑定模式 variable binding patterns

用上边的TreeNode来举个例子,我希望匹配到右节点为“right”的时候返回该节点,那么我就给这个节点绑定一个变量返回。

scala> tree.root match{case TreeNode(_,_,rightNode@TreeNode("right",_,_)) => rig
htNode}
res7: TreeNode = TreeNode(right,null,null)

其中的@符号用于绑定匹配成功之后赋值给rightNode,然后返回。

最近发表
标签列表