文档章节

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

austenliao
 austenliao
发布于 2016/08/12 15:44
字数 792
阅读 114
收藏 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
美好或者丑陋的 Go

这是一个“Go不好”系列的额外文章。Go确实有一些不错的特性,也就是本文中“好的”部分,但是当我们不使用API或者网络服务器(这是为它设计的)而且将它用于业务领域逻辑的时候,总体而言我...

oschina
2018/04/13
6.5K
9
Swift-001-Swift简介及基础语法

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

胡锦涛_Steven
2018/07/16
0
0
为什么 Go 不是一款好的编程语言

我喜欢 Go. 常用它实现各种功能(包括在写本文时的这个博客). Go 很实用,但不够好。 不是说它有多差, 只是没那么好而已。 一门编程语言, 也许会用上一辈子, 所以选择的时候要注意。 本文专...

oschina
2014/12/03
32.9K
158

没有更多内容

加载失败,请刷新页面

加载更多

脚本配置java开发环境

@echo off&setlocal enabledelayedexpansion cls @echo "This script is used to registe envionment variables......" @echo. @echo. @echo. set var=%~dp0 set var=%var:~,-1% @echo "regi......

默克鱼
42分钟前
1
0
c++中友元函数理解与使用

在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点。 首先讲友元函数。 (1)友元函数: 1)C++中引入友元函数,是为在该类中提供一个对外(除...

天王盖地虎626
今天
2
0
OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
1K
14
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
5
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部