Rust学习笔记(十二)枚举定义枚举和Option枚举
枚举
枚举允许我们列举所有可能的值来定义一个类型,例:IP地址分为IPV4和IPV6 enum IpAddrKind { V4, V6, } 枚举值 let four = IpAddrKind::V4; let six = IpAddrKind::V6;
注意枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。这么设计的益处是现在 IpAddrKind::V4 和 IpAddrKind::V6 都是 IpAddrKind 类型的。
例: enum IpAddrKind { V4, V6, } fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6; route(four); route(six); route(IpAddrKind::V4); } fn route(ip_kind: IpAddrKind) {} 将数据附加到枚举的变体中
这里把V4和V6称为枚举的变体
首先看一个枚举类型作为结构体字段的例子: enum IpAddrKind { V4, V6, } struct IpAddr { kind: IpAddrKind, address: String, } fn main() { let home = IpAddr { kind: IpAddrKind::V4, address: String::from("127.0.0.1"), }; let loopback = IpAddr{ kind: IpAddrKind::V6, address: String::from("::1"), }; }
这里使用了结构体将枚举IpAddrKind和address打包在一起,还有一种更简洁的方式来表达相同的概念,就是将数据附加到枚举的变体里,例: enum IpAddrKind { V4(String), V6(String), }
优点: 不需要额外的结构体 每个变体可以拥有不同的类型以及关联的数据量 enum IpAddrKind { V4(u8, u8, u8, u8), V6(String), } fn main() { let home = IpAddrKind::V4(127, 0, 0, 1); let loopback = IpAddrKind::V6(String::from("::1")); }标准库中的IpAddrenum Ipv4Addr { //snip } enum Ipv6Addr { //snip } enum IpAddr { V4(Ipv4Addr), V6(Ipv6Addr), }
再看一个例子: enum Message { Quit, Move {x: i32, y: i32},//匿名结构体 Write(String), ChangeColor(i32, i32, i32), } fn main() { let q = Message::Quit; let m = Message::Move {x: 666, y: 666}; let w = Message::Write(String::from("hello")); let c= Message::ChangeColor(666, 666, 666); } 为枚举定义方法
也使用impl关键字,例: #[derive(Debug)] enum Message { Quit, Move {x: i32, y: i32},//匿名结构体 Write(String), ChangeColor(i32, i32, i32), } impl Message { fn call(&self) { println!("{:#?}", self); } } fn main() { let q = Message::Quit; let m = Message::Move {x: 666, y: 666}; let w = Message::Write(String::from("hello")); let c= Message::ChangeColor(666, 666, 666); q.call(); m.call(); w.call(); c.call(); } Option枚举
Option枚举定义于标准库中,并且在预导入模块(Prelude)中。它描述了某个值(类型)可能存在或不存在的情况。 Rust中没有Null。在其它语言中: Null是一个值,表示"没有值" 一个变量可以处于两种状态:空值(Null)、非空
Tony Hoare,null 的发明者,在他 2009 年的演讲 "Null References: The Billion Dollar Mistake" 中曾经说到: I call it my billion-dollar mistake. At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn"t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years. 我称之为我十亿美元的错误。当时,我在为一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过我未能抵抗住引入一个空引用的诱惑,仅仅是因为它是这么的容易实现。这引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。
Null的问题:当你尝试像使用非Null值那样使用Null值的时候,就会引起程序的某种错误。所以Rust中没有Null。由于某种原因而变为无效或缺失的值的情况无处不在,所以Null的概念还是很重要的。因此Rust提供了类似Null概念的枚举——Option 它在Rust标准库中的定义: enum Option { None, Some(T), }
它包含两个变体Some和None,Some关联一个T类型(泛型)的值,None则对应值无效或缺失的情况。 Option也包含在预导入模块(Prelude)中,可直接使用: Option Some(T) Node
例: fn main() { let some_num = Some(666); let some_str = Some("666"); let absent_number: Option = None; }
编译器可以通过Some里的值推断出Option包含数据的类型,所以不需要指定;但是当我们使用None时,编译器就无法通过None推断出Option中可能包含数据的类型,所以声明时需要指定类型。
问题:既然Option中的None也是对应值缺失或无效的情况,那么它比Null好在哪儿呢?看一个例子: fn main() { let a = 666; let b = Some(666); let sum = a + b; }
当我们试图build以上代码时,编译器报错:cannot add Option<{integer}> to {integer} 因为Option和T是不同的类型,若想使用Option中的T,需要先将它转换为T。在转换的过程中我们就必须考虑其可能为空的情况,换句话说只要值被放入Option,我们若想使用它,就必须检查值无效或缺失的错误。
为了拥有一个可能为空的值,你必须要显式的将其放入对应类型的 Option 中。接着,当使用这个值时,必须明确的处理值为空的情况。只要一个值不是 Option 类型,你就可以安全的认定它的值不为空。这是 Rust 的一个经过深思熟虑的设计决策,来限制空值的泛滥以增加 Rust 代码的安全性。
数智移动实事为民10086迈入多媒体智能交互新时代数字时代,企业与客户之间的连接触点更加多元。随着5G技术发展与移动互联网应用的普及,用户对服务提出了新的要求。中国移动在线营销服务中心作为10086的运营主体中国移动营销服务体系变
中国移动总经理董昕5G基站建设已超56万个,规模全球最大11月2日上午,2021中国移动全球合作伙伴大会主论坛在广州举行。中国移动总经理董昕作题为与您携手共赢未来致辞。董昕在致辞中表示,近年来,中国移动坚决贯彻落实关于发展数字经济的重要
2020大事件回顾LED显示篇,重大投资最新技术回顾2020,年初在疫情的冲击下各行各业陷入了一时的停滞,时代仿佛按下了暂停键。幸好众志成城,国人凭借坚韧的精神,携手从困难中挺了过来,行业也逐渐复苏。在此背景之下,音视频行业披荆
三问MiniMicroLED芯片厂产能技术未来规划作为LED产品的关键组成部分,LED芯片的主要功能是将电能转化为光能,其优劣直接影响着LED终端产品的质量和性能。在需求方面,据TrendForce集邦咨询旗下光电研究处LEDin
车载LED广告屏解决方案车载屏通过新的物联网技术,可以方便的实现基于位置的服务等一系列智能化广告服务,帮助客户实现广告的精准投放。定时定点精准投放通过GPS定位分析,GPS热力图分析,里程数统计,轨迹显示
赛力斯华为智选SF5全场景智能互联在现在的新能源汽车市场中,要问是哪款车最为耀眼的,那非上海车展上深受瞩目的赛力斯华为智选SF5莫属,并且在正式进入市场之后,受到了众人追捧。赛力斯华为智选SF5采用轿跑溜背式车身设
从黑神话悟空被挖人说起黑神话悟空放出演示视频后,一下就火了。很多游戏玩家游戏从业者都很激动很期待,甚至称其为国产3A之光。不过,几乎就是视频放出的第二天,就传出有游戏大厂去黑神话悟空开发公司游戏科学挖人
科技助飞创新三问家居与Treelab达成战略合作2021年10月11日,三问家居股份有限公司(下文称三问家居)与上海企兰科技有限公司(下文称品牌名Treelab)正式达成战略合作,计划共建数字化供应链联合实验室。这是业内首个以无
00后,华晨宇,话语权前几天在朋友家吃饭,说起00后同事过于自我,不懂配合和尊重别人的问题。我的观点是,按年代贴标签的做法是没有道理的。我们对年轻一代看不顺眼,是高速增长的物质生活和迭代缓慢的价值观的矛
为什么我们会死读自私的基因想到的对于普通人来说,了解基因与进化的知识,对生活有什么帮助吗?或许没有。如果不是生物学者,也不从事相关工作,这些知识只能扩展下认知的外延,增加一些可以吹牛装X的谈资而已。不过,很多关于
只为iPhone12做准备?南卡磁吸移动电源3全新升级体验移动电源的发展已然是随着科技的进步而不断的进步,从前期以数据线的形式进行充电,到现在直接无线和有线相结合的方式,从之前只有5000毫安的容量到现在的20000毫安甚至30000毫安
比亚迪南屯汽车城优惠尽享近年来,国内的经济增长迅速,国内的汽车保有量蹭蹭的上涨,虽然说目前市场开始疲软,但是国人对于汽车的热情依旧是高涨,不少的老百姓对于豪车以及新车型都保持着高度的关注,当然也时刻关注着
2021京东快车人群如何做,提高客户精准度,实现高转化最近有很多京东的商家找到我,他们都问了我关于快车人群方面的问题,今天我就和大家聊聊这个主题,希望能够通过我的一些经验,帮助到大家学会快车人群的设置,好了废话少说,我们直接步入正题。
京东新人卖家如何增加客户?京东的运营比商品还要重要,因为运营关系到推荐与排序,搜索商品时,每一个排序都是有所差别的,即使商品价格名字都一样,但有的排在前面,有的排在后面,这就是运营的作用,能让你的京东店更加
可转债已通过证监会审核,未上市发行公司股价走势分析可转债已通过证监会审核未上市的公司是一片蓝海这部分上市公司的可转债申请已经通过证监会审批,最终上不上市由上市公司自己决定,一般有效期是12个月,只要在12个月任何时候公告上市发行都
母婴用品团购小程序怎么做?目前社区团购发展的越来越火热,我们在日常生活中也经常可见各种团购小程序,今天我们就来说说商家该如何制作自己的团购小程序。据小编的了解,目前大多数商家在制作团购小程序的时候都是选择第
母婴行业有必要开发小程序商城吗?怎么制作母婴小程序商城?互联网时代,很多实体店的运营方式已不再局限于线下,而是采用线下线上的运营推广方式。例如母婴实体店,开通微信小程序商城进行线上宣传推广,让客户可以到线下实体店体验购买,当然了,客户也
广告设计公司的微信小程序如何创建大家都清楚微信用户几乎覆盖老老少少,说它是全民APP一点不夸张,而微信小程序的日活跃用户同样以亿为单位,且在不断的增长,其创造的商业价值不可估量,除了微信小程序,其他的平台如百度小
如何快速制作装修公司的微信小程序制作小程序的流程想要完全依靠线下实体店发展行业,显然在今天已经不再行得通,想要获取到更多的客户,维持线下,同时发展线上,通过一些工具,像小程序,社群,营销活动,引流推广,获取客户。如果你从事装修行
抖音该怎么营销产品,抖音营销策略分析看着别人在抖音赚的盆满钵满,很多小伙伴们羡慕不已,抖音营销真的很难吗?其实并不难,作为一个在抖音做了3年运营的老师傅,可以明确告诉你,只要你学会下面的三个步骤,你也可以做好抖音营销
阿里巴巴国际站产品主图及详情图片自动采集保存的方法对于初入国际电商的小白来说设计产品图片的没经验,经常到其他电商平台下载产品图片。在阿里巴巴国际站聚集了大量优秀店铺,这些店铺内图片设计精美有特点,可将阿里巴巴国际站同类产品图片保存
比亚迪宋PLUS车系已覆盖燃油油电混动EV动力产品。日前,比亚迪公布了9月销量数据,乘用车9月全系共销售79037辆,同比增长93。2,环比增长16。9其中新能源乘用车销售70022辆,同比增长276。4。在新能源乘用车当中,DM混