本文主要是介绍学习新时代编程语言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,编写好后保存退出,运行看下效果
在命令行里就可以看到我们的备注信息了吧? 如果我们把B牌输成了BB盘会发生什么呢?我们来试下
这时编译出错了吧,Rust提示我们BB根本不存在,还提示我们是不是要使用的是B?!多好。当我们使用了不存在的枚举值Rust会报错,这个比较好理解,在模式匹配中如果枚举值没有全部考虑到Rust也会报错,接下来我们试一下子,先把BB改回来。使用match 关键字匹配trousers_b的品牌属性,如果是B品牌,我们就输出这是B品牌的裤子。Brand类型的枚举值有A/B/C 3种类型,我们这里只罗列了B品牌的情况,没有考虑A和C。
我们运行看下效果。
报错了吧?Rust提示我们没有考虑到品牌是A和C的情况,这样可以防止我们在编写代码时问题考虑不全是吧?但是如果我们就只关心B品牌的裤子,A,C品牌的裤子都不关心,还得一个一个写出来吗? 在模式匹配中可以直接使用下划线代表其它所有可能的值,我们在这里输出这是其它品牌的裤子。注意这里需要一个逗号分割。
再运行看下效果,这次没有报错了吧?
但是使用下划线还是觉得麻烦,我们可以使用if let语句,我们知道if后面的表达式必须返回布尔类型的值,if let后面是可以跟模式匹配的,我们使用Brand B匹配trousers_b的品牌属性,如果匹配上了就输出这是B品牌的裤子 在后面加个if let标示这是由if let输出的。
编写好后运行看下效果 代码也可以正常执行吧。从这里看Rust还是比较灵活比较人性话的吧?每一种语言特性都有它产生的背景和要应对的问题,虽然枚举类型在面向对象编程中并不是必须的,但现实生活中的确有很多枚举类型存在比如性别,年级,省份等,所以Rust也提供了枚举类型方便我们对现实需求中的类型进行抽象。把业务需求场景映射成类型、对象代码的过程我们就称为抽象,抽象是面向对象编程的基础。在介绍编程语言发展阶段时我们提到,面向对象是为了提高软件可维护性而设计的,接下来我们会介绍面向对象编程的另一个特性也是提高软件可维护性的一个重要手段——封装。
内容根据视频整理,相应视频内容可访问
51cto学院:
免费进群交流
There is no success without challenges, struggles and setbacks. Never quit.
这篇关于学习新时代编程语言Rust视频教程-18罗列出所有裤子品牌名称——面向对象之抽象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!