2.2 Rust 数据类型
2.2 数据类型
let guess: u32 = "42".parse().expect("Not a number!");
Rust has four primary scalar types: integers, floating-point numbers, Booleans, and characters.
整数类型
u32,this type declaration indicates that the value it’s associated with should be an unsigned integer (signed integer types start with i, instead of u) that takes up bits of space. Additionally, the isize and usize types depend on the kind of computer your program is running on: bits if you’re on a -bit architecture and bits if you’re on a -bit architecture.
Note that all number literals except the byte literal allow a type suffix, such as 57u8
, and _
as a visual separator, such as 1_000
.
整数溢出
Let’s say that you have a u8, which can hold values between zero and . What happens if you try to change it to ? This is called “integer overflow,” and Rust has some interesting rules around this behavior. When compiling in debug mode, Rust checks for this kind of issue and will cause your program to panic, which is the term Rust uses when a program exits with an error. In release builds, Rust does not check for overflow, and instead will do something called “two’s complement wrapping.” In short, becomes , becomes , etc. Relying on overflow is considered an error, even if this behavior happens. If you want this behavior explicitly, the standard library has a type, Wrapping, that provides it explicitly.
浮点类型
Rust’s floating-point types are f32
and f64
, which are 32 bits and 64 bits in size, respectively. The default type is f64
because on modern CPUs it’s roughly the same speed as f32
but is capable of more precision.
fn main() {
let x = 64.0 ; //f64
let y: f32 = 32.0; //f32
println!("64:{},32:{}",x,y);
}
The f32 type is a single-precision float, and f64 has double precision.
数字运算
fn main() {
// addition
let _sum = 5 + 10; // subtraction
let _difference = 95.5 - 4.3; // multiplication
let _product = 4 * 30; // division
let _quotient = 56.7 / 32.2; //1.7608695652173911 小数点后16位
let _ff32 = 7f32 / 3f32; //2.3333333 7位小数 // remainder
let _remainder = 13 % 5; //3
println!{"32位除法:{}",_ff32}
println!{"默认64位除法:{}",_quotient};
println!{"求余:{}",_remainder};
}
整数与浮点数不可以混合运算,比如 let _cc = 10 * 3.0; 会报以下错误
^ no implementation for `{integer} * {float}`
error: Could not compile `datatype`.
布尔类型
fn main() {
let _t = true;
let _f: bool = false; // with explicit type annotation
}
字符类型
fn main() {
let _a = 'z';
let _b = 'ℤ';
let _c = 'Z';
}
Rust’s char type represents a Unicode Scalar Value, which means it can represent a lot more than just ASCII. Accented letters; Chinese, Japanese, and Korean characters; emoji; and zero-width spaces are all valid char values in Rust. Unicode Scalar Values range from U+ to U+D7FF and U+E000 to U+10FFFF inclusive. However, a “character” isn’t really a concept in Unicode, so your human intuition for what a “character” is may not match up with what a char is in Rust.
复合类型
Compound types can group multiple values into one type. Rust has two primitive compound types: tuples and arrays.
元组存放数据的数据类型可以不同,数组则必须是相同类型。
元组
A tuple is a general way of grouping together some number of other values with a variety of types into one compound type. Tuples have a fixed length: once declared, they cannot grow or shrink in size.
Each position in the tuple has a type, and the types of the different values in the tuple don’t have to be the same.
fn main() {
let _tup: (i32, f64, u8) = (500, 6.4, 1);
let _aa = (1,2.3,"wa ka ka ");
let (_x,_y,_z) = _aa;
println!("The value of z is:{}",_z)
}
This program first creates a tuple and binds it to the variable tup. It then uses a pattern with let to take tup and turn it into three separate variables, x, y, and z. This is called destructuring, because it breaks the single tuple into three parts. In addition to destructuring through pattern matching, we can access a tuple element directly by using a period (.) followed by the index of the value we want to access.
fn main() {
let _x: (i32, f64, u8) = (500, 6.4, 1);
let _five_hundred = _x.0;
let _six_point_four =_x.1;
let _one = _x.2;
println!("第三个元素:{}",_one);
}
数组类型
Unlike a tuple, every element of an array must have the same type. Arrays in Rust are different from arrays in some other languages because arrays in Rust have a fixed length, like tuples.
fn main() {
let _a = [1, 2, 3, 4, 5];
}
Arrays are useful when you want your data allocated on the stack rather than the heap or when you want to ensure you always have a fixed number of elements. An array isn’t as flexible as the vector type, though. A vector is a similar collection type provided by the standard library that is allowed to grow or shrink in size. If you’re unsure whether to use an array or a vector, you should probably use a vector.
It’s very unlikely that such a program will need to add or remove months, so you can use an array because you know it will always contain 12 items
fn main() {
let _a = [1, 2, 3, 4, 5];
let _months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
}
Arrays have an interesting type; it looks like this: [type; number]
. For example:
fn main() {
let _b: [i32; 5] = [1, 2, 3, 4, 5];
}
访问数组元素
fn main() {
let _b: [i32; 5] = [1, 2, 3, 4, 5];
let _c1 = _b[0];
let _c2 = _b[1];
}
数组越界
fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10; let element = a[index]; println!("The value of element is: {}", element);
}
编译阶段不会报错,在运行时会报错
[root@itoracle src]# cargo build
Compiling datatype v0.1.0 (/usr/local/automng/src/rust/test/datatype)
Finished dev [unoptimized + debuginfo] target(s) in 1.39s
[root@itoracle src]# cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `/usr/local/automng/src/rust/test/datatype/target/debug/datatype`
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:5:19
note: Run with `RUST_BACKTRACE=1` for a backtrace.
类型转换
fn data02(){
println!("-------显式类型转换-------");
let a = ;
let b = a as f64;
let c = b * 2.0;
println!("c={}",c); //c=2
println!("-------------------------------------------------------");
}
2.2 Rust 数据类型的更多相关文章
- Rust 数据类型
Rust中的每个值都具有特定的数据类型. 基础类型: 整数,浮点数,布尔值和字符 i8,i16,i32,i64,i64,i128,isize, u8,u16,u32,u64,u64,u128,usiz ...
- rust数据类型
fn main() { //char支持4个字节,支持emoji let jp = "ゆ"; let emoji = "✨"; let ch = "囧 ...
- Rust学习笔记一 数据类型
写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...
- Rust <1>:数据类型、变量、可变性、常量、隐藏
rust 是强类型语言,所有变量.常量都必须有明确的数据类型:很多情况下,省略类型声明,编译器可自动推导,但不是所有情况下都会成功. rust 有整型.浮点型.布尔型.字符型.数组.元组.枚举.结构体 ...
- Rust之路(2)——数据类型 上篇
[未经书面同意,严禁转载] -- 2020-10-13 -- Rust是系统编程语言.什么意思呢?其主要领域是编写贴近操作系统的软件,文件操作.办公工具.网络系统,日常用的各种客户端.浏览器.记事本. ...
- Rust之路(3)——数据类型 下篇
[未经书面同意,严禁转载] -- 2020-10-14 -- 架构是道,数据是术.道可道,非常道:术不名,不成术!道无常形,术却可循规. 学习与分析数据类型,最基本的方法就是搞清楚其存储原理,变量和对 ...
- Rust基本数据类型
基本类型 Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型. 基本类型意味着它们往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),由以下组成: 数值类型: ...
- Rust语言中的常量,变量,运算符,数据类型
简单练练, 夏天太热. const MAX_POINTS: u32 = 100_100; fn main() { let mut x = 5; let y = 5; let y = y + 1; le ...
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
随机推荐
- 关于MySQL隐式转换
一.如果表定义的是varchar字段,传入的是数字,则会发生隐式转换. 1.表DDL 2.传int的sql 3.传字符串的sql 仔细看下表结构,rid的字段类型: 而用户传入的是int,这里会有一个 ...
- 11.树形Model/View实例
任务1:显示如图的树形结构 思考: 1.使用QTreeView显示. 2.Model使用QStandardItemModel,qt的一个标准model. 3.QStandardItemModel下每一 ...
- 没事写写css
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- SDUT 3401 数据结构实验之排序四:寻找大富翁.!
数据结构实验之排序四:寻找大富翁 Time Limit: 150MS Memory Limit: 512KB Submit Statistic Problem Description 2015胡润全球 ...
- 福大软工1816 · 第五次作业 - 结对作业2_EXE图片_备用
1_每日推荐界面.png 2_论文搜索界面.png 2_论文搜索界面_搜索功能.png 3_流行趋势_十大热词排名统计图.png 4_人物界面.png 5_我的收藏界面.png 6_设置界面.png ...
- 《the art of software testing》 (1-2)章
软件测试的心理学,重点是要认清: 测试时为发现错误而执行程序的过程 成功的测试:如果在测试某段程序时发现了错误,而且这些错误是可以修复的,就将这次合理设计并得到有效执行的测试称作是"成功的& ...
- UCOSIII优先级
优先级 0:中断服务管理任务 OS_IntQTask() 优先级 1:时钟节拍任务 OS_TickTask() 滴答定时器任务 优先级 2:定时任务 OS ...
- Spring 第一个程序-Bean的定义和注册
定义一个实现接口的方法 创建xml文件,这个xml文件就是个所谓的容器 不使用spring容器和使用spring容器创建对象执行代码的区别如下: 下面说一下ApplicationC ...
- Jquery 插件开发——citylinkage(省、市、县城市联动选择)
第一部分:背景 开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了. ...
- timestamp 在curl中变成了Xtamp
目前的解决方案 将timestemp放在数组最前面. [注意:请求的参数中需要将timestamp这个参数放在数组的最前面,不然在GET方式请求中,会出现浏览器将它变成Xtamp,最终导致签名失败]