学习新时代编程语言Rust视频教程-18罗列出所有裤子品牌名称——面向对象之抽象

本文主要是介绍学习新时代编程语言Rust视频教程-18罗列出所有裤子品牌名称——面向对象之抽象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一期我们介绍了struct的使用以及使用impl关键字定义方法、类型关联方法,使用println宏输出裤子对象的编号、名称、长度信息。接下来我们接着说裤子。我们先前讲到小胖的裤子分为A/B/C3个品牌,但是在编写代码时我们的裤子名称是使用字符串表示的,也就是说我们可以任意写裤子品牌名称,可能一不小心就把B牌写成了BB牌,把Adidas写成了Adadas。怎么帮助我们不写错品牌名称呢?在Rust中提供了枚举类型,接下来我们通过代码看下怎么使用枚举类型帮助防止写错品牌名称。
首先使用enum关键字定义一个品牌名称的枚举类型,跟定义struct差不多后面也是使用花括号,跟定义struct不一样的是,花括号里罗列的是枚举类型的可用值而struct的花括号里是结构体类型的属性信息。我们在花括号中罗列出品牌名称的可用值,也就是A品牌、B品牌和C品牌

 enum Brand {A,B,C}

接下来我们修改自定义类型Trousers的定义把它的品牌名称从字符串类型改为枚举类型

struct Trousers {code: u32,brand: Brand,len: u8}

修改下类型关联函数new的参数定义,把品牌名称从String类型换成Brand枚举类型

fn new(code: u32, brand: Brand, len: u8) -> Self {Trousers {code,brand,len}}

这时在创建裤子对象时就不能使用String类型的品牌名称了,只能使用我们我们定义的枚举值,使用枚举类型名称加双冒号加枚举值的形式指定枚举值。

let mut trousers_a = Trousers {code: 111,brand: Brand::A(String::from("A1")),len: 10};

修改好后我们运行看下效果,报了个错误,这个错误我们上一期刚遇到过吧,println宏也不知道怎么输出Brand枚举类型是吧?我们给Brand类型也添加下derive Debug注解,都使用冒号加问号的形式输出。修改好后在运行看下效果。这次没有报错了,我们可以看到在命令行里输出了裤子的信息,裤子的品牌属性是一个Brand类型的枚举值。如果A品牌还有A1和A2俩个子品牌,我们也想在枚举信息中体现出来怎么办呢?我们可以让枚举值A携带一个String类型的备注信息

 enum Brand {A(String),B,C}

这样我们在使用枚举A时就可以添加一个备注说明是A1还是A2,编写好后保存退出,运行看下效果
cargo run
在命令行里就可以看到我们的备注信息了吧? 如果我们把B牌输成了BB盘会发生什么呢?我们来试下
error
这时编译出错了吧,Rust提示我们BB根本不存在,还提示我们是不是要使用的是B?!多好。当我们使用了不存在的枚举值Rust会报错,这个比较好理解,在模式匹配中如果枚举值没有全部考虑到Rust也会报错,接下来我们试一下子,先把BB改回来。使用match 关键字匹配trousers_b的品牌属性,如果是B品牌,我们就输出这是B品牌的裤子。Brand类型的枚举值有A/B/C 3种类型,我们这里只罗列了B品牌的情况,没有考虑A和C。
code
我们运行看下效果。
cargo run
报错了吧?Rust提示我们没有考虑到品牌是A和C的情况,这样可以防止我们在编写代码时问题考虑不全是吧?但是如果我们就只关心B品牌的裤子,A,C品牌的裤子都不关心,还得一个一个写出来吗?  在模式匹配中可以直接使用下划线代表其它所有可能的值,我们在这里输出这是其它品牌的裤子。注意这里需要一个逗号分割。
code
再运行看下效果,这次没有报错了吧?
但是使用下划线还是觉得麻烦,我们可以使用if let语句,我们知道if后面的表达式必须返回布尔类型的值,if let后面是可以跟模式匹配的,我们使用Brand B匹配trousers_b的品牌属性,如果匹配上了就输出这是B品牌的裤子 在后面加个if let标示这是由if let输出的。
if let
编写好后运行看下效果 代码也可以正常执行吧。从这里看Rust还是比较灵活比较人性话的吧?每一种语言特性都有它产生的背景和要应对的问题,虽然枚举类型在面向对象编程中并不是必须的,但现实生活中的确有很多枚举类型存在比如性别,年级,省份等,所以Rust也提供了枚举类型方便我们对现实需求中的类型进行抽象。把业务需求场景映射成类型、对象代码的过程我们就称为抽象,抽象是面向对象编程的基础。在介绍编程语言发展阶段时我们提到,面向对象是为了提高软件可维护性而设计的,接下来我们会介绍面向对象编程的另一个特性也是提高软件可维护性的一个重要手段——封装。

内容根据视频整理,相应视频内容可访问

51cto学院:
51cto

免费进群交流

KeepLearning

There is no success without challenges, struggles and setbacks. Never quit.

这篇关于学习新时代编程语言Rust视频教程-18罗列出所有裤子品牌名称——面向对象之抽象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633910

相关文章

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert