文档章节

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

austenliao
 austenliao
发布于 2016/08/12 15:44
字数 792
阅读 103
收藏 1
点赞 1
评论 0

一、结构体
结构体是一种复合结构类型,是数个简单基础类型的集合体。
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
Rust语言开发基础(八)Rust的接口及其实现

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

Robinson_L
2016/04/09
448
0
《Swift语言》中文版

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

红薯
2014/06/13
27.2K
10
rust 语法概要(只适合不熟悉时快速查阅使用,不适合理解其精髓。未完待续)

注意:本内容只适合快查,不适合理解精髓。精髓请研读 https://kaisery.github.io/trpl-zh-cn/foreword.html 基本数据类型 i8,i16,i32,i64,i128 u8,u16,u32,u64,u128 f32,f64 char bool:true...

捍卫机密
07/18
0
0
【读书笔记】A Swift Tour

素材:A Swift Tour 推荐下载Playground:Download Playground objc 自己较为熟悉,想熟悉下风头正劲的 swift。就先从官方的入门手册开始撸。 每一小节,我都摘录或总结3个对自己三观冲击最大...

ios122
01/06
0
0
为什么你需要近距离接触 Rust 1.0

在不背离安全或抽象的情况下,拥有极高的运行效率,能预防几乎所有的错误,提供优越的底层控制和性能——这些都是Rust1.0版本做出的承诺,而这仅仅是个开始。 经过几年的迭代改进,Rust编程语...

oschina
2015/08/13
3.4K
16
C语言编程学习程序解析:数据类型和函数返回值解析

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信分享的细节

分享的缩略图要求: 一、图片大小小于32k 二、图片的尺寸为 宽度 :128px 高度:128px 分享title 和 description 出现金额等 以上情况存在会导致触发分享按钮 但是页面没有反应...

Js_Mei
10分钟前
0
0
【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】

1、编写shell脚本,计算1-100的和; #!/bin/bashsum=0for i in `seq 1 100`do sum=$[$sum+$i]doneecho $sum 2、编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求...

lgsxp
13分钟前
0
0
xss攻防浅谈

导读 XSS (Cross-Site Script) 攻击又叫跨站脚本攻击, 本质是一种注入攻击. 其原理, 简单的说就是利用各种手段把恶意代码添加到网页中, 并让受害者执行这段脚本. XSS能做用户使用浏览器能做的...

吴伟祥
13分钟前
0
0
js回调的一次应用

function hideBtn(option) { if (option == 1) { $("#addBtn").hide(); $("#addSonBtn").hide(); }}$("body").on("click", "#selectBtn", function () {......

晨猫
19分钟前
0
0
C++_读写ini配置文件

1.WritePrivateProfileString:

一个小妞
19分钟前
0
0
通往阿里,BAT的50+经典Java面试题及答案解析(上)

Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性...

Java大蜗牛
19分钟前
1
0
数据库两大神器【索引和锁】

前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。 本文力求简单讲清每个知识点,希望大家看完能有所收获 声明:如果没有说明具体的数据库...

Java3y
23分钟前
0
0
Application Express安装

Application Express安装文档 数据库选择和安装 数据库选择 Oracle建议直接12.2.0.1.0及以上的版本,12.1存在20618595bug(具体可参见官方文档) Oracle 12c 中安装oracle application expr...

youfen
35分钟前
0
0
OpenMessaging概览

序 本文主要研究一下OpenMessaging 架构图 namespace,类似cgroup的namespace,用来进行安全隔离,每个namespace有自己的producer、consumer、topic、queue等 producer,消息生产者有两类,一...

go4it
40分钟前
0
0
MySQL索引类型

MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 https://www.cnblogs.com/luyucheng/p/6289714.html...

灯下草虫鸣_
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部