Rust-类型

这篇具有很好参考价值的文章主要介绍了Rust-类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

bool

布尔类型(bool)代表的是“是”和“否”的二值逻辑。它有两个值:true和false。

一般用在逻辑表达式中,可以执行“与”“或”“非”等运算。

Rust-类型,Rust,rust,开发语言,后端

char

字符类型由char表示。它可以描述任何一个符合unicode标准的字符值。在代码中,单个的字符字面量用单引号包围。

Rust-类型,Rust,rust,开发语言,后端
字符类型字面量也可以使用转义符:
Rust-类型,Rust,rust,开发语言,后端
因为char类型的设计目的是描述任意一个unicode字符,因此它占据的内存空间不是1个字节,而是4个字节。

对于ASCⅡ字符其实只需占用一个字节的空间,因此Rust提供了单字节字符字面量来表示ASCⅡ字符。我们可以使用一个字母b在字符或者字符串前面,代表这个字面量存储在u8类型数组中,这样占用空间比char型数组要小一些。示例如下:

Rust-类型,Rust,rust,开发语言,后端

整数类型

Rust有许多的数字类型,主要分为整数类型和浮点数类型。本节讲解整数类型。各种整数类型之间的主要区分特征是:有符号/无符号,占据空间大小。

Rust-类型,Rust,rust,开发语言,后端
需要特别关注的是isize和usize类型。

它们占据的空间是不定的,与指针占据的空间一致,与所在的平台相关。如果是32位系统上,则是32位大小;如果是64位系统上,则是64位大小。

在C++中与它们相对应的类似类型是int_ptr和uint_ptr。Rust的这一策略与C语言不同,C语言标准中对许多类型的大小并没有做强制规定,比如int、long、double等类型,在不同平台上都可能是不同的大小,这给许多程序员带来了不必要的麻烦。相反,在语言标准中规定好各个类型的大小,让编译器针对不同平台做适配,生成不同的代码,是更合理的选择。

数字类型的字面量表示可以有许多方式:

Rust-类型,Rust,rust,开发语言,后端字面量后面可以跟后缀,可代表该数字的具体类型,从而省略掉显示类型标记:
Rust-类型,Rust,rust,开发语言,后端

我们可以为任何一个类型添加方法,整型也不例外。比如在标准库中,整数类型有一个方法是pow,它可以计算n次幂,于是我们可以这么使用:

Rust-类型,Rust,rust,开发语言,后端
我们甚至可以不使用变量,直接对整型字面量调用函数:
Rust-类型,Rust,rust,开发语言,后端
对于整数类型,如果Rust编译器通过上下文无法分析出该变量的具体类型,则自动默认为i32类型。比如:
Rust-类型,Rust,rust,开发语言,后端

整数溢出

在整数的算术运算中,有一个比较头疼的事情是“溢出”。

在C语言中,对于无符号类型,算术运算永远不会overflow,如果超过表示范围,则自动舍弃高位数据。

对于有符号类型,如果发生了overflow,标准规定这是undefined behavior,也就是说随便怎么处理都可以。

未定义行为有利于编译器做一些更激进的性能优化,但是这样的规定有可能导致在程序员不知情的某些极端场景下,产生诡异的bug。

Rust的设计思路更倾向于预防bug,而不是无条件地压榨效率,Rust设计者希望能尽量减少“未定义行为”。

比如彻底杜绝“Segment Fault”这种内存错误是Rust的一个重要设计目标。

当然还有其他许多种类的bug,即便是无法完全解决,我们也希望能尽量避免。

整数溢出就是这样的一种bug。

Rust在这个问题上选择的处理方式为:默认情况下,在debug模式下编译器会自动插入整数溢出检查,一旦发生溢出,则会引发panic。

在release模式下,不检查整数溢出,而是采用自动舍弃高位的方式。示例如下:

Rust编译器还提供了一个独立的编译开关供我们使用,通过这个开关,可以设置溢出时的处理策略:

$rustc -C overflow-checks=no test.rs

“-C overflow-checks=”可以写“yes”或者“no”,打开或者关闭溢出检查。

如果在某些场景下,用户确实需要更精细地自主控制整数溢出的行为,可以调用标准库中的checked_*、saturating_*和wrapping_*系列函数。

Rust-类型,Rust,rust,开发语言,后端
输出结果为:
Rust-类型,Rust,rust,开发语言,后端
checked_*系列函数返回的类型是Option<_>,当出现溢出的时候,返回值是None。

saturating_*系列函数返回类型是整数,如果溢出,则给出该类型可表示范围的“最大/最小”值。

wrapping_*系列函数则是直接抛弃已经溢出的最高位,将剩下的部分返回。

在对安全性要求非常高的情况下,强烈建议用户尽量使用这几个方法替代默认的算术运算符来做数学运算,这样表意更清晰。

在Rust标准库中就大量使用了这几个方法,而不是简单地使用算术运算符,值得大家参考。
在很多情况下,整数溢出应该被处理为截断,即丢弃最高位。

浮点类型

Rust提供了基于IEEE 754-2008标准的浮点类型。按占据空间大小区分,分别为f32和f64,其使用方法与整型差别不大。浮点数字面量表示方式有如下几种:
Rust-类型,Rust,rust,开发语言,后端
Infinite和Nan是带来更多麻烦的特殊状态。Infinite代表的是“无穷大”,Nan代表的是“不是数字”(not a number)。

指针类型

  • 同一个类型,某些时候可以指定它在栈上,某些时候可以指定它在堆上。内存分配方式可以取决于使用方式,与类型本身无关。
  • 既可以直接访问数据,也可以通过指针间接访问数据。可以针对任何一个对象取得指向它的指针。
  • 既可以在复合数据类型中直接嵌入别的类型的实体,也可以使用指针,间接指向别的类型。
  • 甚至可能在复合数据类型末尾嵌入不定长数据构造出不定长的复合数据类型。Rust里面也有指针类型,而且不止一种指针类型。
    Rust-类型,Rust,rust,开发语言,后端
    在标准库中还有一种封装起来的可以当作指针使用的类型,叫“智能指针”(smart pointer)。

Rust-类型,Rust,rust,开发语言,后端

类型转换

Rust对不同类型之间的转换控制得非常严格。即便是下面这样的程序,也会出现编译错误:
Rust-类型,Rust,rust,开发语言,后端
Rust提供了一个关键字as,专门用于这样的类型转换:
Rust-类型,Rust,rust,开发语言,后端

tuple

tuple指的是“元组”类型,它通过圆括号包含一组表达式构成。tuple内的元素没有名字。tuple是把几个类型组合到一起的最简单的方式。比如:Rust-类型,Rust,rust,开发语言,后端
元组内部也可以一个元素都没有。这个类型单独有一个名字,叫unit(单元类型):let empty:()=();

可以说,unit类型是Rust中最简单的类型之一,也是占用空间最小的类型之一。
Rust-类型,Rust,rust,开发语言,后端

struct

结构体(struct)与元组类似,也可以把多个类型组合到一起,作为新的类型。区别在于,它的每个元素都有自己的名字。举个例子:

Rust-类型,Rust,rust,开发语言,后端

tuple struct

Rust有一种数据类型叫作tuple struct,它就像是tuple和struct的混合。区别在于,tuplestruct有名字,而它们的成员没有名字:
Rust-类型,Rust,rust,开发语言,后端

enum

如果说tuple、struct、tuple struct在Rust中代表的是多个类型的“与”关系,那么 enum类型在Rust中代表的就是多个类型的“或”关系。

Rust-类型,Rust,rust,开发语言,后端文章来源地址https://www.toymoban.com/news/detail-792195.html

到了这里,关于Rust-类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Rust 基础篇】Rust String 类型详解

    在 Rust 中,String 是一种动态可变的字符串类型,它提供了对字符串的灵活操作和修改能力。与字符串字面量(string literals)不同,String 类型是可变的,可以根据需要进行修改。本篇博客将详细介绍 Rust 中的 String 类型,包括定义、常用方法和使用示例。 在 Rust 中,可以使用

    2024年02月12日
    浏览(42)
  • Rust教程:How to Rust-基本类型

    本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议完全无计算机基础的同学 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用: 操作系统macOS Sonoma 14 / Apple M1 编译器:Rustc Cargo 感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^ Rust教

    2024年04月12日
    浏览(40)
  • 深入理解Rust基本类型

       团队博客: 汽车电子社区   Rust基本类型有如下几种:     1、 数值类型 : 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数。     2、 字符串 :字符串字面量和字符串切片 str。     3、 布尔类型 :

    2024年01月20日
    浏览(47)
  • Rust-类型

    布尔类型(bool)代表的是“是”和“否”的二值逻辑。它有两个值:true和false。 一般用在逻辑表达式中,可以执行“与”“或”“非”等运算。 字符类型由char表示。它可以描述任何一个符合unicode标准的字符值。在代码中,单个的字符字面量用单引号包围。 字符类型字面量也

    2024年01月16日
    浏览(50)
  • 3.Rust数据类型

    Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型。 Rust是一个强类型语言与js不同,我们在声明变量时就要指定该变量的类型,编译器必须在编译期知道我们所有变量的类型。当然大多时聪明的编译器可以自动推导类型,但为了保证代码质量和

    2024年03月10日
    浏览(55)
  • Rust 原生类型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Rust 学习系列 ,rust中的原生类型 标量类型(scalar type) 布尔类型(bool):表示真假值。 字符类型(char):表示单个Unicode字符。 整数类型(integer):表示整数值,包括有符号和无符号整数。 有符号整

    2024年02月21日
    浏览(36)
  • rust学习-类型转换

    根据其他类型生成自己 把其他类型转为目的类型 要把任何类型转换成 String,只需要实现那个类型的 ToString trait 实现fmt::Display trait,它会自动提供 ToString,并且还可以用来打印类型 用 parse 函数 只要对目标类型实现了 FromStr trait,就可以用 parse 把字符串转换成目标类型 “涡

    2024年02月11日
    浏览(32)
  • Rust- 类型转换

    Rust is a statically typed language, which means that it emphasizes on knowing the types of all variables at compile time. The concept of type safety is very crucial in Rust, and the language provides several mechanisms for type conversion. Type conversion in Rust is explicit, meaning that you need to specify the type you want to convert to. Here are two com

    2024年02月14日
    浏览(38)
  • Rust 基础入门 —— 基本类型

    在Rust 中,作为强类型语言,自然会独立一块内容用作类型管理工作,而rust 中 为应用领域的扩展, 兼容了很多的数学计算方面的 内容,加到了基本类型中,例如 复数, 在有向图和 矢量图计算中的应用,rust 通过自带的类型设计避免了 程序员再开发的任务难度。 总的来说

    2024年02月12日
    浏览(37)
  • Rust之通用集合类型

    在Rust语言中包含了一系列被称为集合的数据结构。大部分的数据结构都代表着某个特定的值,但集合却可以包含多个值。与内置的数组与元组类型不同,这些集合将自己持有的数据存储在了堆上。这意味着数据的大小不需要在编译时确定,并且可以随着程序的运行按需扩大或

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包