学习新时代编程语言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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个不安分的程序员

祝您财源广进

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值