文档章节

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

austenliao
 austenliao
发布于 2016/08/12 15:44
字数 792
阅读 105
收藏 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语言

概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言、ObjC的特性,且克服了C语言的兼容性问题。Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在其...

jianxin160
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
《Swift语言》中文版

中文版 Apple 官方 Swift 教程《The Swift Programming Language》 目录: 欢迎使用 Swift 关于 Swift(完成 By numbbbbb) Swift 初见(完成 By numbbbbb) Swift 教程 基础部分(完成 By numbb...

红薯
2014/06/13
27.2K
10

没有更多内容

加载失败,请刷新页面

加载更多

OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
3
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0
Permissions 0777 for ‘***’ are too open

异常显示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ......

李玉长
今天
5
0
区块链10年了,还未落地,它失败了吗?

导读 几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 几乎每个人,甚...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部