文档章节

Rust语言开发基础(九)复杂数据类型:结构体,枚举,泛型

austenliao
 austenliao
发布于 2016/08/12 15:44
字数 792
阅读 109
收藏 1

一、结构体
结构体是一种复合结构类型,是数个简单基础类型的集合体。
struct    Point    {
    x:    i32,
    y:    i32,
}
fn    main()    {
    let    origin    =    Point    {    x:    0,    y:    0    };    //    origin:    Point
    println!("The    origin    is    at    ({},    {})",    origin.x,    origin.y);
}

1. 使用大写字母开头并且使用驼峰命名法。
2. 使用圆点来调用结构体里的变量。
3. 结构体默认值不可变,使用mut使其可变,但是不支持结构体里面字段的可变性,即mut不能修饰里面的字段。
4. 使用..拷贝其它结构体的值。
struct    Point3d    {
    x:    i32,
    y:    i32,
    z:    i32,
}
可以拷贝自己
let    mut    point    =    Point3d    {    x:    0,    y:    0,    z:    0    };
point    =    Point3d    {    y:    1,    ..    point    };
或者也可以拷贝其它结构体
let    mut    point    =    Point3d    {    x:    0,    y:    0,    z:    0    };
point    =    Point3d    {    y:    1,    ..    point    };
结果是:point    =    Point3d    {    x:    0,    y:    1,    z:    0    };

元组结构体(衍生)
struct    Color(i32,    i32,    i32);
struct    Point(i32,    i32,    i32);

1. 没有字段名称。

2. 即使值与结构体相同,两者也是不相等的。
let    black    =    Color(0,    0,    0);
let    origin    =    Point(0,    0,    0);
即black!=origin

3. 比较适合的场景:单元素的元组结构,也称为“新类型”。
struct    Inches(i32);
let    length    =    Inches(10);
let    Inches(integer_length)    =    length;
println!("length    is    {}    inches",    integer_length);
意思是let  Inches(integer_length)给    integer_length    赋值为    10    。

类单元结构体(衍生)
1.无字段,没有任何成员变量:struct    Electron;
2.用处较少,省略


二、枚举
枚举是一个代表数个可能变量的数据的类型
1.可以携带各种类型的变量
enum    Message    {
    Quit, //类单元结构体
    ChangeColor(i32,    i32,    i32), //元组结构体
    Move    {    x:    i32,    y:    i32    }, //结构体
    Write(String), //方法函数
}
上述枚举类似一个网络游戏的消息

2. 可以通过两个冒号::来实现枚举里的变量的调用及其赋值
Message枚举的调用:
let    x:    Message    =    Message::Move    {    x:    3,    y:    4    };

enum    BoardGameTurn    {
    Move    {    squares:    i32    },
    Pass,
}
let    y:    BoardGameTurn    =    BoardGameTurn::Move    {    squares:    1    };

3. 典型的使用错误
 let    Message::ChangeColor(r,    g,    b)    =    msg;    //    compile-time    error
直接绑定类型的操作不被支持

4. 典型应用:枚举的构造器可以当函数一样使用
这里会考虑将函数作为参数传递给其他函 数。
例如,使用迭代器,我们可以这样把一个    String    的vector转换为一个    Message::Write    的vector:
let    v    =    vec!["Hello".to_string(),    "World".to_string()];
let    v1:    Vec<Message>    =    v.into_iter().map(Message::Write).collect();
 

三、泛型

泛型类

案例1.标准库中的一个类型
enum    Option<T>    {
                Some(T),
                None,
}
使用:
let    x:    Option<i32>    =    Some(5);
let    y:    Option<f64>    =    Some(5.0f64);

案例2. Rust内建类型
     
enum    Result<T, E>    {
                Ok(T),
                Err(E),
}

泛型函数

1. 普通单泛型类约束
fn  takes_anything<T>(x:    T)    {
                //    do    something    with    x
}
<T>代表“这个函数带有一个泛型类型”,而x:T代表“x是T类型的”。

2. 多参数一泛型类型约束

fn    takes_two_of_the_same_things<T>(x:    T,    y:    T)    {
                //    ...
}

3. 多参数多泛型类型约束
fn    takes_two_things<T,    U>(x:    T,    y:    U)    {
                //    ...
}

泛型函数结合“特性约束”时最有用

泛型结构体

struct    Point<T>    {
                x:    T,
                y:    T,
}
let    int_origin       =    Point    {    x:    0,    y:    0    };
let    float_origin    =    Point    {    x:    0.0,    y:    0.0    };


 

© 著作权归作者所有

共有 人打赏支持
austenliao
粉丝 21
博文 17
码字总数 17804
作品 0
广州
技术主管
私信 提问
iOS开发系列--Swift语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/47753245 概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言、ObjC的特...

KenshinCui
2015/08/18
0
0
Swift笔记枚举和结构体

枚举 枚举概念 枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值 C/OC语言中枚举指定相关名称为一组整形值 Swift 中的枚举更加灵活,可以提供一个值是...

大基本功
2017/12/31
0
0
Swift-001-Swift简介及基础语法

1.Swift简介 2014年WWDC 发布的新开发语言,可与OC共同运行于Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。 swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是...

胡锦涛_Steven
07/16
0
0
Rust语言开发基础(七)Rust 特性

这部分是Rust语言的核心部分,掌握起来有一定难度,特别是生命周期部分,让人有Rust的学习曲线陡升的感觉,爬过这座高峰,其它皆坦途。 这部分也是让人觉得Rust语言比其它语言如C/C++等复杂的...

Robinson_L
2016/03/25
793
0
Rust语言开发基础(八)Rust的接口及其实现

trait(特征)类似于其他语言中的interface或者protocol,指定一个实际类型必须满足的功能集合 一、如何理解trait,可以从我们所了解的接口特性去推断trait的用法 1. 那么作为一个类接口的关键...

Robinson_L
2016/04/09
448
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 安装PHP5和PHP7

安装PHP5 下载解压二进制包 [root@test-a src]# cd /usr/local/src/[root@test-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[root@test-a src]# tar jxvf php-5.6......

野雪球
今天
4
0
windows上类似dnsmasq的软件Dual DHCP DNS Server

官网地址:http://dhcp-dns-server.sourceforge.net/官网定向的下载地址:https://sourceforge.net/projects/dhcp-dns-server/files/ 设置参考地址:http://blog.51cto.com/zhukeqiang/18264......

xueyuse0012
今天
3
0
LinkedHashMap源码解析

前言 HashMap中的元素时无序的,也就是说遍历HashMap的时候,顺序和放入的顺序是不一样的。 如果需要有序的Map,就可以采用LinkedHashMap. LinkedHashMap通过维护一个包含所有元素的双向链表,...

grace_233
今天
3
0
初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
5
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部