文档章节

Rust学习笔记一 数据类型

山茶文具店
 山茶文具店
发布于 2019/12/08 01:19
字数 1728
阅读 10
收藏 0

写在前面

我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差。

自学了Java、Kotlin、Python、Rust,学艺不精但还是总结出一套快速入手新语言的规律。学习一个新语言的套路我总结为:数据类型(包括命名方式),控制语句(循环,逻辑判断),方法命名方式,类相关的面向对象(继承,接口,多态如果是面向对象语言),特有语法糖。

Rust安装

官网已经写得很详细啦,附赠安装方法

个人使用的是Linux,如果使用的是MacOS都是可以一条命令行搞定,推荐使用Windows的用户开启WSL来安装Rust,然后用VScode的remote-ssh插件编写代码。

为什么需要分辨数据类型?

写过js,Python的同学都知道,命名变量的时候我们不需要指定数据类型,事实上大部分动态语言都不需要指定类型,然而静态语言,类似Java、C这样需要编译的语言,在程序编译时都要分配好我们变量的内存空间,也就是在编译时,需要明确知道我们变量的数据类型,所以需要指定好数据类型。

Rust数据类型

变量的命名以及可变与不可变

命名

使用关键字let来命名变量

fn main() {
	let a=5;//let翻译是让,所以可以叫做 使变量a的值为5
}

可变与不可变

fn main() {
	let a=5;
	//变量默认情况下,不可变
	a=6;
	//这样写会报错,因为我们命名了一个不可变的变量a
	//之后又修改了a的值为6
	//变量的值发生了变化,所以编译时不会通过
}

rust默认情况下,所有变量都是不可变的,如果需要变量可变,则需要用let mut来命名变量 mut是单词mutable(可变)的缩写。

let mut a=5;
a=6;
//这样写是不会报错的。

整型

接下来我们来看一下Rust的数据类型中的整型。

整型的命名方式:有符号-- i(bit) 无符号--u(bit)

百度:一个字节(byte)为8个比特(bit)

如8bit的有符号整型:i8

32bit的无符号整型:u32

bit可以使用的数值为:8、16、32、64、128、size

size:如果计算机是32位,则 isizei32,64位则为i64

let a:i32=5;
let b:isize=133;
let c:u128=111;

但是刚刚我们在可变性中,并没有指定a变量的类型啊?

这是因为如果给出具体数值,在Rust中是可以不指定具体类型的,编译器会去推倒他的类型。 那么let a=3这样写,他的类型会是多少呢? 在Rust中,这样的写法默认类型是i32,并且也建议大家使用i32这个类型,这是因为编译器对于i32这个类型做过特殊优化。 在运算上i32会比其他数据类型更快。

当然啦!Rust作为一种底层语言,运行速度已经很快了。

整型的一些写法

let a=1234567;
let b=1_234_567;
let c=0xff;//十六进制

这两种写法数值是一样的,第二种写法更加直观。_并没有什么特殊的作用

浮点

也就是我们常说的小数。相对于整数,小数多了一个小数点.,而小数点所在的位置又不确定,看起来就好像是在一串数中浮动一样,所以我们称小数为浮点数(floating-point numbers)。 类比整型来学习,浮点数有两种,单精度浮点f32和双精度浮点f64

fn main(){
	let a=3.14;//a的类型为f64
	let b:f32=3.14;//b的类型为f32
}

Rust中默认浮点类型为f64这是因为他们的计算速度几乎一样快,但是f64的精度更高。

布尔

bool是布尔类型,只有truefalse

let t=true;
let f=false;
let t1:bool=true;

字符

let a='a';
let b:char='A';

char类型为单引号字符,内存分配四个字节

字符串

前面的都属于基本数据类型,字符串是一种更为复杂的类型,它事实上是一个结构体(类),每次使用都需要新建一个对象。这里我们先简单了解一下。

let s=String::new();
let s=String::from("Hello");

::和我们常用的类.方法类似,但是::用在实例化的方法上面。这里只说字符串的实例化,后面再说其他的用法。

元组

Rust中很多方法返回值都会用到元组,元组可以返回一组特定类型的返回值,在使用的时候更加灵活。我们先来看一下元组的定义。

let a:(i32,f64)=(1,1.12);
let b=(1,23);

()里面表明每一项的数据类型。如果指明值,也可以不标明元组的数据类型,编译器会帮我们推倒。

元组的解构匹配

fn main() {
    let a:(i32,f32)=(1,1.732);
    let (b,c)=a;
    println!("{},{}",b,c);
}

println!()是一个宏,和我们在其他语言用到的print语句类似,都是在控制台输出,{}是一个占位符,控制我们的输出结构。

这样操作可以分解我们的元组到变量上。很好理解就不拆开细说。

数组

let a = [1, 2, 3, 4, 5]; //第一种
let b: [i32; 5] = [1, 2, 3, 4, 5];//第二种
let c = [3; 5];//第三种

命名数组目前有三种方法,我们分别来看他们的区别。首先需要注意的是数组内部的所有元素类型必须是一样的。

  • 第一种和第二种相同,之前提到过的如果已知类型,则可以不写明类型,有编译器推导。
  • 第三种着重说明一下,3表示三个,5表示数值,也就是说创建一个拥有3个5的数组。适合数组内部元素一模一样的情况。

获取数组元素

fn main() {
    let a = [1, 2, 3, 4, 5];
    println!("{}",a[1])
}

和其他编程语言相同,数组下标也是从零开始。用[index]来获取数组元素。如果超出了数组范围,在编译时不会报错,但是运行时会报错,因为访问了一个无效的内存。

© 著作权归作者所有

山茶文具店
粉丝 0
博文 4
码字总数 4989
作品 0
私信 提问
Rust基础笔记之浅谈Ownership

写在前面 Ownership System是Rust中最独特和吸引人的特性,Rust也是依靠这个特性来实现他的最大的目标:内存安全,所有Rust的开发者都应该详细了解它。 多么浓厚的翻译味道,的确本人学习Rus...

junanhonglei
2016/03/16
57
0
Rust 1.2.0 翻译官网总结(一)

介绍 Rust 编程语言 欢迎学习本教程!本教程将教你如何使用 Rust 编程语言。Rust 是一门强调安全、性能和并发性的系统编程语言。它为了达到这几个目的,甚至没有一个垃圾收集器。这也使 Rust...

起名字凡人
2015/09/14
176
0
Rust 2017 调查报告:学习曲线是最大痛点

Rust 官方在社区上做了一次调查,以了解用户如何看待 Rust 的发展。调查共收到 5368 份回复,其中有 大约 2/3 的是 Rust 用户,剩下的 1/3 是非 Rust 用户,调查结果如下。 点此查看完整调查...

王练
2017/09/07
6.4K
53
Rust语言实现的Slab内存管理器源码分析

Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)...

曾赛
2016/10/09
359
0
小白必备!Rust 编程语言入门教程

开发者小伙伴们, Rust 您一定要了解一下 最近的一项 Stack Overflow 调查发现, 近 80% 的受访者 都喜欢或希望使用 Rust 语言进行开发。 这个数字真是令人难以置信! 那么 Rust 有什么益处呢...

IBMdW
2018/04/18
489
0

没有更多内容

加载失败,请刷新页面

加载更多

Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java

1. Overview The java.io.File class has three methods — getPath(), getAbsolutePath() and getCanonicalPath() — to obtain the filesystem path. In this article, we'll have a quick......

Ciet
47分钟前
43
0
Spring5 依赖注入和循环依赖处理

//TODO populateBean 注入属性 doGetBean->getSingleton 删除bean缓存

小小明1995
57分钟前
67
0
每天AC系列(七):合并两个有序链表

1 题目 LeetCode第21题,合并两个有序链表. 2 直接合并 因为已经有序了,类似归并排序中的合并一样,操作不难,直接上代码了. ListNode t = new ListNode(0);ListNode head = t;while(l1 != nu...

Blueeeeeee
今天
47
0
数据结构之双向链表-c语言实现

原文链接:http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e5%8f%8c%e5%90%91%e9%93%be%e8%a1%a8-c%e8%af%ad%e8%a8%80%e5%ae%9e%e7%8e%b0/ 这次完成了双向链表的代......

无心的梦呓
今天
65
0
SpringCloud 基础教程(六)-负载均衡Ribbon

 我的博客:兰陵笑笑生,欢迎浏览博客!  上一章 SpringCloud基础教程(五)-配置中心热生效和高可用当中,我们对配置中心进行进行了深入的了解,本章将继续微服务架构的深入学习,了解在微服务...

_兰陵笑笑生
今天
49
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部