首页 > 其他分享 >模式匹配

模式匹配

时间:2023-08-13 09:26:10浏览次数:28  
标签:case TreeNode 模式 模式匹配 匹配 match

第14章 模式匹配

模式匹配是检查某个值(value)是否匹配某一个模式的机制,一个成功的匹配同时会将匹配值解构为其组成部分。它是Java中的switch语句的升级版,同样可以用于替代一系列的 if/else 语句。

模式匹配有点像一个别致的switch声明,它可以侵入到表达式数据结构内部,对这个结构进行检验和提取子表达式。如果没有模式能够匹配,会抛出MatchError。可以用case_模式来避免。

它由一个表达式引入,例如 ds 后边紧跟一个关键字match和一个用花括号封起来的一系列的case 语句,每一条case 语句由=> 箭头右边的模式(Cons(x,xs))和=>箭头右边的结果(x*product(xs))组成。如果目标匹配其中一种模式,它的结果就是整个match表达式的结果。如果目标与多个模式都匹配,Scala 选择第一个匹配的结果。

Ø模式可以当作对某个类型,其内部数据在结构上抽象出来的表达式。模式匹配(pattern-matching)则是匹配变量是否符合这种pattern。

看如下例子

匹配一个数组,它由三个元素组成,第一个元素为1,第二个元素为2,第三个元素为3

Array(1,2,3) match (case Array(1,2,3) => println("ok"))

常量模式(constant patterns):包含常量变量和常量字面量。

def foo(s: String): String = s match {
    case "ESOFT" => "HBD BigData"
    case _ => "I don't know "
  }

变量模式(variable patterns):确切的说单纯的变量模式没有匹配判断的过程,只是把传入的对象给起了一个新的变量名。

println("输入点啥:")
var temp = scala.io.StdIn.readLine()
temp match {
	case whateverName => println(whateverName)
}

通配符模式(wildcard patterns):通配符用下划线表示:“_” ,可以理解成一个特殊的变量或占位符。单纯的通配符模式通常在模式匹配的最后一行出现,case _ => 它可以匹配任何对象,用于处理所有其它匹配不成功的情况。通配符模式也常和其他模式组合使用。

def wildcardMatch(array: Array[Int]): String = array match{
    case Array(_,_,3) => "succ"
    case _ => "fail"
}

构造器模式(constructor patterns):非常好用,真正能体现模式匹配威力的模式,通过构造函数匹配对象

val tree = Tree(TreeNode("root",TreeNode("left",null,null),TreeNode("right",null,null)))
     //希望构造一个节点 左子节点值为”left”,右子节点值为”right”并且右子节点没有子节点
     
     tree.root match {
       case TreeNode("root", TreeNode("left",_,_), TreeNode("right", null, null))
       =>
       println("ok")
       case _ => println("error")
	}

类型模式(type patterns):类型模式很简单,就是判断对象是否是某种类型, isInstanceOf 判断类型的效果一样(Scala提倡使用模式匹配),需要注意的是scala 匹配泛型时要注意,如果使用了泛型,它会被擦拭掉,无法准确匹配泛型内部的内容

def foo(a: Any): String = a match {
    //只能检查包装,检查不了里面的货物一次 下面这行应当这样写List[_]
    case a: List[Int] => "OK"
    case _ => "fail"
}

标签:case,TreeNode,模式,模式匹配,匹配,match
From: https://www.cnblogs.com/simpleness/p/17626131.html

相关文章

  • openGauss学习笔记-24 openGauss 简单数据管理-模式匹配操作符
    openGauss学习笔记-24openGauss简单数据管理-模式匹配操作符数据库提供了三种独立的实现模式匹配的方法:SQLLIKE操作符、SIMILARTO操作符和POSIX-风格的正则表达式。除了这些基本的操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。24.1LIKE描述:判断字......
  • 掌握 Python RegEx:深入探讨模式匹配
    动动发财的小手,点个赞吧!什么是正则表达式?正则表达式通常缩写为regex,是处理文本的有效工具。本质上,它们由一系列建立搜索模式的字符组成。该模式可用于广泛的字符串操作,包括匹配模式、替换文本和分割字符串。历史数学家StephenColeKleene在20世纪50年代首次引入正则......
  • 字符串的模式匹配算法
    一.模式匹配字符串的模式匹配算法是用来查找一个字符串中是否存在另一个指定的字符串(即模式)的算法。常见的模式匹配算法包括暴力匹配算法、KMP算法、Boyer-Moore算法和Rabin-Karp算法。暴力匹配算法:暴力匹配算法也称为朴素匹配算法,是最简单的一种字符串匹配算法。它从主串的第一个......
  • 17.模式与模式匹配
    模式(patterns)是Rust中一种用来匹配类型结构的特殊语法。将模式与match表达式或其他工具配合使用可以更好地控制程序流程。一个模式匹配通常由以下组件构成:字面量解构地数组、枚举、结构体或元组变量通配符占位符模式被用来与某个特定地值进行匹配。如果模式与值匹配成功,那......
  • scala模式匹配
     https://blog.csdn.net/shenlei19911210/article/details/78538255https://www.cnblogs.com/barrywxx/p/10850502.html......
  • Rust语言 学习17 模式匹配
    一、模式基本概念二、模式可辩驳性三、模式语法......
  • Rust编程语言入门之模式匹配
    模式匹配模式模式是Rust中的一种特殊语法,用于匹配复杂和简单类型的结构将模式与匹配表达式和其他构造结合使用,可以更好地控制程序的控制流模式由以下元素(的一些组合)组成:字面值解构的数组、enum、struct和tuple变量通配符占位符想要使用模式,需要将其与某个值进行比......
  • 串的模式匹配(BF算法)
    【问题描述】串的模式匹配算法BF的实现与应用。【输入形式】第一行输入主串s;第二行输入模式串t;输入串中均不包含空格字符。【输出形式】模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。【样例输入1】ababcabcacbabab【样例输出1】13612【样例输入2】11111345......
  • rust模式匹配(可驳模式匹配与不可驳模式匹配)
    rust的一个特性就是模式匹配(OOP编程语言好像都有?),模式匹配常常和变量绑定一起考虑常见的模式匹配有:match、iflet、whilelet、let、for、函数参数等等(for和let我个人认为说是模式匹配,其实有点牵强了,除非这样let(x,y)=(1,2)可驳与不可驳可驳模式匹配要求一定要穷尽所有......
  • C # 9.0 的模式匹配
    voidM(objecto1,objecto2){vart=(o1,o2);if(tis(int,string)){}//testifo1isanintando2isastringswitch(o1){caseint:break;//testifo1isanintcaseSystem.String:break;//testifo1isastring}}关系模式 与常数值相......