范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Rust学习笔记(五十四)模式(匹配)语法

  匹配字面值
  模式匹配可以直接匹配字面值,例: fn main() {     let x = 1;      match x {         1 => println!("one"),         2 => println!("two"),         3 => println!("three"),         _ => println!("anything"),     } } 匹配命名变量
  命名变量是可匹配任何值的不可辩驳模式,例: fn main() {     let x = Some(5);     let y = 10;      match x {         Some(50) => println!("Got 50"),         Some(y) => println!("Matched, y = {:?}", y),//Some(y)匹配的是x,即Some(5),所以此处y是5         _ => println!("Default case, x = {:?}", x),     }      println!("at the end: x = {:?}, y = {:?}", x, y); }
  运行输出: Matched, y = 5 at the end: x = Some(5), y = 10
  因为模式匹配里的y在模式匹配后已走出作用域,后面打印的y是外面的y。 多重匹配
  在match表达式中,使用|(或)语法,可以匹配多种模式,例: fn main() {     let x = 1;      match x {         1 | 2 => println!("one or two"),         3 => println!("three"),         _ => println!("anything"),     }      let x = Some(5);      match x {         Some(1 | 2 | 5) => println!("here"),         _ => println!("la la la"),     } } 使用..=来匹配某个范围的值
  例: fn main() {     let x = 5;      match x {         1..=5 => println!("one through five"),         _ => println!("something else"),     }      let x = "c";      match x {         "a"..="j" => println!("early ASCII letter"),         "k"..="z" => println!("late ASCII letter"),         _ => println!("something else"),     } } 解构以分解值
  可以使用模式来解构结构体、枚举、元组,从而引用这些类型值的不同部分。例: struct Point {     x: i32,     y: i32, }  fn main() {     let p = Point { x: 0, y: 7 };      let Point { x: a, y: b } = p;     assert_eq!(0, a);     assert_eq!(7, b);      let Point { x, y } = p;     assert_eq!(0, x);     assert_eq!(7, y);      match p {         Point { x, y: 0 } => println!("On the x axis at {}", x),//匹配x随意,y是0的情况         Point { x: 0, y } => println!("On the y axis at {}", y),//匹配y随意,x是0的情况         Point { x, y } => println!("On neither axis: ({}, {})", x, y),//匹配x随意,y也随意的情况     } } 解构枚举
  例: enum Message {     Quit,     Move { x: i32, y: i32 },//结构体枚举变体     Write(String),     ChangeColor(i32, i32, i32), }  fn main() {     let msg = Message::ChangeColor(0, 160, 255);      match msg {         Message::Quit => {             println!("The Quit variant has no data to destructure.")         }         Message::Move { x, y } => {             println!(                 "Move in the x direction {} and in the y direction {}",                 x,                 y             );         }         Message::Write(text) => println!("Text message: {}", text),         Message::ChangeColor(r, g, b) => {             println!(                 "Change the color to red {}, green {}, and blue {}",                 r,                 g,                 b             )         }     } } 解构嵌套的结构体和枚举
  例: enum Color {     Rgb(i32, i32, i32),     Hsv(i32, i32, i32), }  enum Message {     Quit,     Move { x: i32, y: i32 },     Write(String),     ChangeColor(Color), }  fn main() {     let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));      match msg {         Message::ChangeColor(Color::Rgb(r, g, b)) => {             println!("Change the color to red {}, green {}, and blue {}", r, g, b)         }         Message::ChangeColor(Color::Hsv(h, s, v)) => {             println!(                 "Change the color to hue {}, saturation {}, and value {}",                 h, s, v             )         }         _ => (),     } } 解构结构体和枚举
  例: struct Point {     x: i32,     y: i32, }  fn main() {     let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 }); } 在模式中忽略值
  有几种方式可以在模式匹配中忽略整个值或部分值: _ _配合其它模式 使用以_开头的名称 ..忽略值的剩余部分 fn foo(_: i32, y: i32) {//忽略整个值     println!("This code only uses the y parameter: {}", y); }  fn main() {     foo(3, 4); }
  大部分情况当你不再需要特定函数参数时,最好修改签名不再包含无用的参数。在一些情况下忽略函数参数会变得特别有用,比如实现 trait 时,当你需要特定类型签名但是函数实现并不需要某个参数时。此时编译器就不会警告说存在未使用的函数参数,就跟使用命名参数一样。fn main() {     //_忽略部分     let mut setting_value = Some(5);     let new_setting_value = Some(10);      match (setting_value, new_setting_value) {         (Some(_), Some(_)) => {             //只要求setting_value和new_setting_value都是Some即可,忽略里面的值             println!("Can"t overwrite an existing customized value");         }         _ => {             setting_value = new_setting_value;         }     }      println!("setting is {:?}", setting_value);      let numbers = (2, 4, 8, 16, 32);      match numbers {         (first, _, third, _, fifth) => {             println!("Some numbers: {}, {}, {}", first, third, fifth)         }     } } fn main() {     let _x = 5;//_开头会忽略未使用的变量     let y = 10;//没有_,并且未使用的变量会被编译器警告 }
  注意, 只使用 _ 和使用以下划线开头的名称有些微妙的不同:比如 _x 仍会将值绑定到变量,而 _ 则完全不会绑定。fn main() {     let s = Some(String::from("Hello!"));      if let Some(_s) = s {         println!("found a string");     }      println!("{:?}", s);//编译器报错,因为_变量仍然会被绑定值,所以 s 的值会移动进 _s,这时s无法使用了。 } fn main() {     let s = Some(String::from("Hello!"));      if let Some(_) = s {//只有下划线不会绑定值,所以通过编译         println!("found a string");     }      println!("{:?}", s); } fn main() {     struct Point {         x: i32,         y: i32,         z: i32,     }      let origin = Point { x: 0, y: 0, z: 0 };      //使用..忽略x以外的字段     match origin {         Point { x, .. } => println!("x is {}", x),     } } fn main() {     let numbers = (2, 4, 8, 16, 32);      match numbers {//忽略中间的部分(无论中间有多少个),只要第一个和最后一个         (first, .., last) => {             println!("Some numbers: {}, {}", first, last);         }     } } fn main() {     let numbers = (2, 4, 8, 16, 32);      match numbers {//存在歧义,因为编译器不知道我们要的是中间的哪一个元素,所以无法编译         (.., second, ..) => {             println!("Some numbers: {}", second)         },     } } 使用match守卫来提供额外的条件
  match守卫就是match分支后额外的if条件,若想要匹配成功该条件也必须满足。match守卫适应于比单独的模式更复杂的场景,例: fn main() {     let num = Some(4);      match num {         Some(x) if x < 5 => println!("less than five: {}", x),         Some(x) => println!("{}", x),         None => (),     }      let x = 4;     let y = false;      match x {//配合多重匹配         4 | 5 | 6 if y => println!("yes"),         _ => println!("no"),     } } @绑定
  @符号让我们可以创建一个变量,该变量可以在测试某个值是否与模式匹配的同时保存该值。 例: fn main() {     enum Message {         Hello { id: i32 },     }      let msg = Message::Hello { id: 5 };      match msg {         Message::Hello {             id: id_variable @ 3..=7,//要求id的值在3到7的范围时,将其值保存在id_variable中         } => {             println!("Found an id in range: {}", id_variable)         }         Message::Hello { id: 10..=12 } => {             println!("Found an id in another range")         }         Message::Hello { id } => {             println!("Found some other id: {}", id)         }     } }

传媒周周评区块链的7个要点直播答题极速挑战已获批复一3点钟区块链社群7天讨论成果其实也就这7个要点事件2月11日的凌晨3点,SEEUQYGAME创始人CEO玉红和一群不睡觉的圈内人深夜聊区块链到起劲儿处,众人一拍即合,建起了一个名爱奇艺B站,会给华尔街讲什么样的商业模式?新年开春不久,中国传媒业又传喜讯,爱奇艺和B站准备到美国上市。其中,爱奇艺在其招股说明书中披露,拟融资15亿美元,寻求的市场估值为100亿美元B站寻求2018年第一季度在美国上市,决策参考80以上的中国独角兽在北上深杭1中国独角兽地图扎堆互联网产业80以上居北上深杭事件从产业分布来看,独角兽多扎堆于互联网产业,实体产业极少从归属领域来看,它们多集中在消费领域从地域来看,80以上的独角兽群居于北上莱克魔力风空气调节扇,让这个夏天更加自由无ampampquot线ampampquot!看着这天气预报上的温度一天比一天高,我们就知道夏天是真的到了,夏天在人们的印象里就是空调WiFi大西瓜,但大家不可能每天都呆在家里吹空调,尤其是夏天家庭聚会时大家都喜欢户外烧烤,喜西湖大学的突破与未来近日,教育部批准了西湖大学的设立,其前身是施一公院士于2016年12月创立的浙江西湖高等研究院。西湖大学作为新生事物在办学性质和管理方式上都取得了巨大突破,但是其仍然会面临诸多难题财政部中宣部要求2018年底前国有文化企业全部改为有限责任公司1财政部中宣部2018年底前国有文化企业全部改为有限责任公司事件近日,财政部中共中央宣传部印发中央文化企业公司制改制工作实施方案的通知强调,2018年底前国有文化企业要全部改为有限科技感十足!折叠翻盖这都不算啥,ampampquot它ampampquot才是王道手机的出现似乎已经改变了一个时代,不仅其外观发生了变化,而且越来越具有科技感。因此,今天我们就来讨论讨论这个话题,即三款具有技术感的折叠手机!1。三屏翻盖手机FlipPhone这款女子不如男?科技圈也有德才兼备的女神,冲这颜值也要支持一波1。摩拜单车创始人胡玮炜摩拜单车大家应该都用过吧,它的创始人是胡玮炜,1982年生于浙江东阳。在创立摩拜单车之前,胡玮炜在汽车技术媒体领域拥有十年的经验。她曾经创立科技媒体极客汽车网友小米没有核心技术,怎么走到现在!小米谁还不是真香怪了对于许多经常需要在夜晚工作的人来说,台灯非常重要,但在桌面上使用台灯经常会遇到这几个痛点首先,一般来说,台灯的体积偏大,第二个是亮度和色温调节不令人满意,第三是光线会造成眩光,从而蓝牙耳机通话降噪技术哪家强?还得看漫步者DreamPods1。骨传导AI通话降噪技术与测试作为漫步者的粉丝,一直对其青睐有加。漫步者的耳机质量非常好,外观非常好看,最主要的是价格也不贵,对于我这样的学生党来说,非常适合。因此,我接连购买了互联互通破解公链痛点,技术联盟营造新生态去年以来,公有链异常火爆,但是也出现了劣币驱逐良币等不良现象,而要实现公有链的良性发展,就必须回归公有链的初心和规律,认认真真踏踏实实解决好公有链发展中的痛点,而由星云链Nebul
iOS14。7beta5暗示iOS或将支持第三方应用来源?前几天苹果向全体开发者用户和公测用户推送了iOS14。7beta5(18G5063a),其中主要更新仍是针对底层性能优化和bug修复。但还有一个小的细节改动可能会改变整个iOS生态希望破灭!两大游戏平台终止合并,腾讯3年努力付诸东流国内互联网行业发展迅猛,在短短数年的时间里已经领先全球,阿里在电商行业无人能及,腾讯的社交和游戏一家独大,美团凭借外卖闯出了一片新天地,这些互联网企业都有一个共同的特点那就是各自拥外媒关注游戏直播平台虎牙斗鱼合并被拒据美联社香港7月10日报道,中国市场监管机构周六在一项反垄断调查后阻止了腾讯支持的游戏直播平台斗鱼与虎牙的合并。报道称,虎牙和斗鱼是中国此类企业中最大的两家。它们提供视频游戏直播服苹果A15处理器曝光,第二代5nm工艺,真正的顶级芯片苹果一直主打高端市场,在处理器性能方面一直都是排在最前面,每年稳步推进A系列处理器的研发工作,在最近几年苹果还自研GPU图形能力更是超越友商不少产品,目前网上已经曝光最新A15处理蓝牙耳机固件升级需要的注意事项大家升级蓝牙耳机的固件时是不是会出现升级失败的场景,接下来我就说一下蓝牙耳机固件升级的一些注意的地方。首先肯定就是要打开我们手机的蓝牙,然后有些手机需要打开地理位置,就都打开吧,把Win11怎么添加蓝牙设备?有时我们需要使用计算机和手机使用蓝牙传输。如果您不连接蓝牙,则无法使用它,您希望在Win11系统中搜索蓝牙设备,因此如何使用Windows11添加蓝牙设备?如果你想拥有网友,你仍然库克ampampquot忽悠了大家ampampquot,不是苹果13而是12S,120Hz屏幕9月精湛来袭笔歌科技独家报道苹果9月份新机最终命名为12S,不是之前曝出来的苹果13,虽然在媒体采访中库克声称13,但鉴于手机整体迭代不大,最终还是取名为12S,一起来围观。01不是苹果13而当4388元的华为P50,遇上5399元的iPhone13,为何宁可选苹果?今年下半年旗舰市场,虽然缺少了三星Note21系列,但华为P50和iPhone13的较量却也吸引着不少消费者目光。目前两款手机都还未发布,产品配置外观,价格却都已被产业链曝光。据悉事与愿违,苹果小屏时代将划上句号?iPhone13mini或成最后绝唱如今市面上在售的小屏手机可谓屈指可数,为了追求更好的视觉效果以及方便用户操作,现在大部分智能手机的屏幕尺寸都设定在6。3英寸以上。常言道萝卜青菜各有所爱,不少消费者仍然对小屏手机钟麒麟芯片鸿蒙OS2128G,仅售6099元!没有5G加持依然不会绝唱提到华为手机,大家都觉得麒麟芯片性能强大,而且使用起来一点都没有卡顿的现象。不过由于麒麟芯片的产能受到限制的原因,华为手机的产能也受到了非常大的影响。不过华为为了解决麒麟芯片产能不有人说,谁能解决电池的问题,谁就能成为下一个世界首富,你怎么看?一电池的发展史首先,我们来大致看一下电池的发展史。1800年,意大利物理学家亚历山德罗伏特发明了世界上第一块电池。1859年,由法国物理学家贾斯顿普兰发明了最早可以充电的电池,铅酸