rust abc(2): 从 hello world 到整数、浮点类型

news2025/1/9 2:02:28

在这里插入图片描述

文章目录

    • 1. 目的
    • 2. 搞懂 hello world
      • 2.1 代码
      • 2.2 `fn` 的含义
      • 2.3 `main()` 的含义
      • 2.4 `println!` 的含义
      • 2.5 行尾分号是必要的吗?
      • 2.6 左花括号可以放下一行吗?
    • 3. 数据类型的例子
      • 3.1 代码
      • 3.2 rust 的注释
      • 3.3 编译运行结果
      • 3.4 基本数据类型
    • 4. 整数类型的例子
      • 4.1 代码
      • 4.2 还是代码
      • 4.3 整数类型的最大值、最小值
    • 5. 浮点类型
      • 5.1 不能给浮点类型赋值为整数
      • 5.2 浮点类型赋值
    • 6. References

1. 目的

通过一些微型的 rust 样例代码, 学习 rust 的基本语法,以及整数、浮点数类型的初步使用。

2. 搞懂 hello world

2.1 代码

使用 cargo new hello-rust 创建的工程中,代码如下:

fn main()
{
    println!("Hello, world!");
}

2.2 fn 的含义

rust 的一个关键字。表示函数

2.3 main() 的含义

函数名称, 也是程序入口点。相当于C/C++可执行程序的 main() 函数.

尝试把 main() 改为 main2():

fn main2() {
    println!("Hello, world!");
}

编译会报错:

zz@Legion-R7000P% cargo run
   Compiling hello-rust v0.1.0 (/home/zz/work/rust_abc/hello-rust)
error[E0601]: `main` function not found in crate `hello_rust`
 --> src/main.rs:3:2
  |
3 | }
  |  ^ consider adding a `main` function to `src/main.rs`

For more information about this error, try `rustc --explain E0601`.
error: could not compile `hello-rust` (bin "hello-rust") due to previous error

2.4 println! 的含义

println! 是 rust 语言预定义的一个宏。rust 语言中的宏是以 ! 结尾。可以暂时把 rust 的宏理解为 “函数的加强版”。

2.5 行尾分号是必要的吗?

乍一看, println! 这句去掉分号也能运行:

fn main() {
    println!("Hello, world!")
}

但 rust 中的分号的含义是: 压制表达式的结果。也就是说,如果表达式结尾没有分号, 那么表达式(的返回值)就会被返回。

举一个和是否用;导致不同结果的例子:

let a = {
    let inner = 2;
    inner * inner
};

let b = {
    let inner = 2;
    inner * inner;
};

其中 a 的值将为4, 而 b 的类型并不是整数类型。

zz@Legion-R7000P% cat src/main.rs
fn main() {
    println!("Hello, world!");
    let a = {
        let inner = 2;
        inner * inner
    };
    println!("{}", a);

}
zz@Legion-R7000P% cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/hello-rust`
Hello, world!
4
zz@Legion-R7000P% cat src/main.rs
fn main() {
    println!("Hello, world!");
    let a = {
        let inner = 2;
        inner * inner
    };
    println!("{}", a);

    let b = {
        let inner = 2;
        inner * inner;
    };
    println!("{}", b);
}
zz@Legion-R7000P% cargo run
   Compiling hello-rust v0.1.0 (/home/zz/work/rust_abc/hello-rust)
error[E0277]: `()` doesn't implement `std::fmt::Display`
  --> src/main.rs:13:20
   |
11 |         inner * inner;
   |                      - help: remove this semicolon
12 |     };
13 |     println!("{}", b);
   |                    ^ `()` cannot be formatted with the default formatter
   |
   = help: the trait `std::fmt::Display` is not implemented for `()`
   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0277`.
error: could not compile `hello-rust` (bin "hello-rust") due to previous error

2.6 左花括号可以放下一行吗?

fn main()
{
    println!("Hello, world!")
}

实际编译运行了下, 可以使用的; 不过 rustfmt 则要求说应该放在同一行1

为了保持代码结构的良好可读性,Rust 中定义各种语言项,包括控制结构(if / match 等)、函数、结构体、枚举等,要求左花括号与其定义保持同一行。

3. 数据类型的例子

3.1 代码

代码来自23:
data_type.rs:

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>());
}

fn main() {
    let food = "清蒸螃蟹"; // string 字符串类型
    let price = 7767517; // float 类型
    let checked = true; // boolean 类型

    println!("food is {}", food);
    print_type_of(&food);
    println!("price is {}", price);
    print_type_of(&price);
    println!("checked is {}", checked);
    print_type_of(&checked);
}

3.2 rust 的注释

Rust 中的注释方式与其它语言(C、Java)一样,支持两种注释方式:

// 这是第一种注释方式

/* 这是第二种注释方式 */

/*
 * 多行注释
 * 多行注释
 * 多行注释
 */

个人比较习惯 // 作为注释符号, 因此在 ~/.vimrc 中的注释快捷键命令里进行配置:

"-- prepend comment chars in each line
" https://vi.stackexchange.com/questions/8128/how-to-toggle-comments-with-ctrl
noremap <C-m> :<S-Left>exe "<S-Right>normal! I".b:commentType<CR>
" autocmd BufReadPost *.[ch] let b:commentType='// '
autocmd FileType c let b:commentType='// '
autocmd FileType cpp let b:commentType='// '
autocmd FileType python let b:commentType='# '
autocmd FileType cmake let b:commentType='# '
autocmd FileType vim let b:commentType='" '
autocmd FileType rust let b:commentType='// '

3.3 编译运行结果

rustc data_type.rs
./data_type
food is 清蒸螃蟹
&str
price is 7767517
i32
checked is true
bool

Rust 是一个静态的严格数据类型的语言。每个值都有唯一的数据类型,要么是整型,要么是浮点型等等。

Rust 语言在赋值时并不强制要求指定变量的数据类型,Rust 编译器可以根据分配给它的值自动推断变量的数据类型。

上面的代码中,我们并没有为每一个变量指定它们的数据类型。Rust 编译器会自动从 等号 = 右边的值中推断出该变量的类型。例如 Rust 会自动将 双引号 阔起来的数据推断为 字符串,把没有小数点的数字自动推断为 整型。把 true 或 false 值推断为 布尔类型。

3.4 基本数据类型

Rust 语言中有四种标量数据类型:

  • 整型
  • 浮点型
  • 布尔类型
  • 字符类型

4. 整数类型的例子

let price = 100; 默认类型是 i32.

4.1 代码

int_types.rs:

fn main() {
    let price = 100;
    let price2:u32 = 200;
    let price3:i32 = -300;
    let price4:isize = 400;
    let price5:usize = 500;

    println!("price is {}", price);
    println!("price2 is {} and price3 is {}", price2, price3);
    println!("price4 is {} and price5 is {}", price4, price5);

    let price6:i32 = 66.66;
    let price7:i8 = 192;
}

其中 let price6:i32 = 66.66 在编译时就报错了, 原因是等号左右两侧的数据类型不匹配:

zz@Legion-R7000P% rustc int_types.rs
error[E0308]: mismatched types
  --> int_types.rs:12:22
   |
12 |     let price6:i32 = 66.66;
   |                ---   ^^^^^ expected `i32`, found floating-point number
   |                |
   |                expected due to this

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

4.2 还是代码

这次把刚刚报错的 price6 一行注释掉。

fn main() {
    let price = 100;
    let price2:u32 = 200;
    let price3:i32 = -300;
    let price4:isize = 400;
    let price5:usize = 500;

    println!("price is {}", price);
    println!("price2 is {} and price3 is {}", price2, price3);
    println!("price4 is {} and price5 is {}", price4, price5);

    //let price6:i32 = 66.66;
    let price7:i8 = 192;
}

编译运行, 发现 price7 这行报错了, 原因是等号右侧的值 192 超过了等号左侧数据范围 [ − 128 , 127 ] [-128, 127] [128,127]

zz@Legion-R7000P% rustc int_types.rs
warning: unused variable: `price7`
  --> int_types.rs:13:9
   |
13 |     let price7:i8 = 192;
   |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_price7`
   |
   = note: `#[warn(unused_variables)]` on by default

error: literal out of range for `i8`
  --> int_types.rs:13:21
   |
13 |     let price7:i8 = 192;
   |                     ^^^
   |
   = note: the literal `192` does not fit into the type `i8` whose range is `-128..=127`
   = help: consider using the type `u8` instead
   = note: `#[deny(overflowing_literals)]` on by default

error: aborting due to previous error; 1 warning emitted

4.3 整数类型的最大值、最小值

fn main() {
    println!("std::u128::MAX is {}, std::i128::MAX is {}, std::i128::MIN is {}", std::u128::MAX, std::i128::MAX, std::i128::MIN);
    println!("std::u64::MAX is {}, std::i64::MAX is {}, std::i64::MIN is {}", std::u64::MAX, std::i64::MAX, std::i64::MIN);
    println!("std::u32::MAX is {}, std::i32::MAX is {}, std::i32::MIN is {}", std::u32::MAX, std::i32::MAX, std::i32::MIN);
    println!("std::u16::MAX is {}, std::i16::MAX is {}, std::i16::MIN is {}", std::u16::MAX, std::i16::MAX, std::i16::MIN);
    println!("std::u8::MAX is {}, std::i8::MAX is {}, std::i8::MIN is {}", std::u8::MAX, std::i8::MAX, std::i8::MIN);
}
zz@Legion-R7000P% ./int_types 
std::u128::MAX is 340282366920938463463374607431768211455, std::i128::MAX is 170141183460469231731687303715884105727, std::i128::MIN is -170141183460469231731687303715884105728
std::u64::MAX is 18446744073709551615, std::i64::MAX is 9223372036854775807, std::i64::MIN is -9223372036854775808
std::u32::MAX is 4294967295, std::i32::MAX is 2147483647, std::i32::MIN is -2147483648
std::u16::MAX is 65535, std::i16::MAX is 32767, std::i16::MIN is -32768
std::u8::MAX is 255, std::i8::MAX is 127, std::i8::MIN is -128

5. 浮点类型

5.1 不能给浮点类型赋值为整数

fn main() {
    let price8:f64 = 99; // compile error
}
zz@Legion-R7000P% rustc float_types.rs
error[E0308]: mismatched types
 --> float_types.rs:2:22
  |
2 |     let price8:f64 = 99; // compile error
  |                ---   ^^
  |                |     |
  |                |     expected `f64`, found integer
  |                |     help: use a float literal: `99.0`
  |                expected due to this

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

5.2 浮点类型赋值

默认是 float64 类型。

rust 允许数字的表示中含有下划线,相当于打印版数字中的逗号

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>());
}

fn main() {
    //let price8:f64 = 99; // compile error
    let price9 = 18.00;
    print_type_of(&price9);
    
    let price10:f32 = 8.88;
    let price11:f64 = 168.125;

    println!("price9 {}", price9);
    println!("price10 {}", price10);
    println!("price11 {}", price11);

    // rust 允许数字的表示中含有下划线,相当于打印版数字中的逗号
    let price12 = 1_000_000;
    println!("price12 {}", price12);

    let price13 = 1_000_000.666_123;
    println!("price13 {}", price13);
}
zz@Legion-R7000P% rustc float_types.rs
zz@Legion-R7000P%       ./float_types 
f64
price9 18
price10 8.88
price11 168.125
price12 1000000
price13 1000000.666123

6. References


  1. P.FMT.04 语言项(Item) 定义时左花括号(brace)位置应该与语言项保持同一行 ↩︎

  2. 第 4 章 Rust 的数据类型 ↩︎

  3. 如何在Rust中打印一个变量的类型?《跟星哥一起学RUST语言》 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC系列-3 拦截器

背景 本文作为 SpringMVC系列 的第三篇&#xff0c;以SpringMVC系列-2 HTTP请求调用链为基础&#xff0c;介绍Spring MVC的拦截器。 1.拦截器 SpringMVC的核心实现是DispatcherServlet&#xff0c;本质是一个Servlet实现类&#xff0c;拦截器位于DispatcherServlet逻辑中&am…

MySQL进阶SQL语句2之表连接

目录 1.连接查询 1.1inner&#xff08;内连接&#xff09; 1.2left join&#xff08;左连接&#xff09; 1.3right join&#xff08;右连接&#xff09; 1.4直接查询两个表相同的字段值的数据 2. VIEW&#xff08;视图&#xff09; 2.1create view&#xff08;创建视图…

设计模式之迭代器模式笔记

设计模式之迭代器模式笔记 说明Iterator(迭代器)目录迭代器模式示例类图学生类抽象迭代器角色接口具体迭代器角色类抽象聚合角色接口具体聚合角色类测试类 说明 记录下学习设计模式-迭代器模式的写法。JDK使用版本为1.8版本。 Iterator(迭代器) 意图:提供一种方法顺序访问一…

Python2、3下载安装、环境配置和Python2、3版本共存配置

一、python 版本简介 python 包括 python2、python3 两个大版本&#xff0c;其中 python3 改进了 python2 的一些不足&#xff0c;但由于以前很多应用是用 python2 开发的&#xff0c;维护这些应用还需用到 python2&#xff0c;故 python2 尚未被完全淘汰。 北京时间 2020 年 4…

近期参与开源的心得体会

引言 最近随着Kepler项目加入CNCF sandbox&#xff0c;写一篇blog来记录下参与这个项目半年的发展的心得体会。 运营 项目的运营最好还是专注于项目自身的发展&#xff0c;围绕项目的特点&#xff0c;创新点入手&#xff0c;为大家提供价值&#xff0c;从而自然而然的扩大自…

【计算机网络】计算机网络期末自测题(一)答案

2019-2020 学年第 2 学期自测题答案及评分标准 (卷 1) 计算机网络 一、 填空题&#xff1a; 参考答案&#xff1a; 1 、 01000101 、11100111 3 、 100Mbps、双绞线、基带、全双工 [10Mbps 要求单位] 4 、 报文 5 、 ICMP 6 、 虚电路 7 、 距离矢量、链路状态 …

什么是网络安全?

文章目录 一、概述1.1 网络安全的指标1.2 网络安全的特征 二、网络安全威胁2.1 黑客能破坏的2.2 Internet安全手段2.2.1 端口扫描2.2.2 分组嗅探sniffing2.2.3 IP欺骗Spoofing 2.3 Internet安全威胁2.3.1 DOS拒绝服务 三、密码学3.1 对称加密算法3.1.1 传统加密3.1.2 现代加密技…

Redis(七):Redis基础入门

Redis基础入门 Redis用途Redis优缺点docker运行RedisRedis常用命令String命令Hash命令List命令Set命令ZSet命令全局命令 Redis事务Redis持久化机制RDBAOFRDBAOF&#xff08;默认&#xff09; Redis内存淘汰机制Redis对过期Key的处理 Redis用途 Redis是一种开源的NoSQL内存数据库…

【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View

文章目录 3个记录隐藏列字段undo日志模拟 MVCCRead View 数据库并发的场景有三种&#xff1a; 读-读 &#xff1a;不存在任何问题&#xff0c;也不需要并发控制 读-写 &#xff1a;有线程安全问题&#xff0c;可能会造成事务隔离性问题&#xff0c;可能遇到脏读&#xff0c;幻读…

UOS系统下搭建qtcreator编译环境

文章目录 前言一、依赖包说明二、No valid kits found 问题现象三、No valid kits found 问题解决1.查找qt安装路径2.设置Qt Versions3.构建套件&#xff08;kit&#xff09;下选择Qt版本4.重新添加工程 前言 本文记录了在UOS系统下如何安装qtcreator以及涉及的依赖包安装&…

冷静期or跌落神坛:净水市场纠结,“易开得”们路在何方?

文丨琥珀消研社 作者丨余二 1986年11月1日&#xff0c;一场火灾拉开了世界三大水污染——莱茵河水污染的序幕。 是夜&#xff0c;位于瑞士巴塞尔市的桑多兹化学公司的一个化学品仓库发生火灾&#xff0c;装有约1250吨剧毒农药的钢罐爆炸&#xff0c;大火持续了4个多小时&…

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

背景 开发小伙伴都知道线上服务挂掉&#xff0c;基本都是因为cpu或者内存不足&#xff0c;出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗&#xff1f; 图片 对就是这个0&#xff0c;和本次事…

团体程序设计天梯赛-练习集L2篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

【golang中的变量 全局/局部/4中声明】

目录 变量变量的分析1.变量的创建的四种形式1.1总结1.2第一种 var a int 声明1.3 第二种 var a string "XXXX" 初始化1.4第三种 var a "XXXX"1.5第四种 a : XXXX 2.一次性声明多个变量3.一次初始化多个变量3.1交换值 4.全局变量--局部变量5. 声明和初始化…

Kafka生产调优源码

一、Kafka硬件配置选择 1.1 场景说明 100 万日活&#xff0c;每人每天 100 条日志&#xff0c;每天总共的日志条数是 100 万 * 100 条 1 亿条。 1 亿/24 小时/60 分/60 秒 1150 条/每秒钟。 每条日志大小&#xff1a;0.5k - 2k&#xff08;取 1k&#xff09;。 1150 条/…

算法------排序算法------冒泡排序法

介绍 冒泡排序法又称交换排序法&#xff0c;原理是从第一个元素开始&#xff0c;比较相邻元素的大小&#xff0c;如大小顺序有误&#xff0c;则对调后再进行下一个元素的比较&#xff0c;一次扫描之后可以确保最后一个元素位于正确的位置。接下来进行的第二次扫描&#xff0c;…

SSMP整合案例(5) Spring Boot整合MyBatis-Plus实现条件查询

讲完条件查询 那么 我们整个数据层的代码就写完了 可以看到 我们之前的代码 查询语句都有一个 参数 QueryWrapper 这个就是查询条件 其实 我们可以直接这样写 QueryWrapper<book> Query new QueryWrapper<>(); bookDao.selectList(Query);QueryWrapper类需要手…

Spring加载后初始化的9种方式

本文来聊一下在spring中&#xff0c;当spring 容器启动后&#xff0c;我们有几种初始化操作的方式。 目录 Spring加载后初始化的几种方式 Component和Service加构造方法 ContextRefreshedEvent事件 代码如下&#xff1a; 输出结果&#xff1a; PostConstruct 注解 代码如…

基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

一、骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB&#xff1a;使用最广&#xff0c;包含信息最多&#xff0c;从RGB可以得到Flow、Skeleton。但是处理需要较大的计算量 Flow&#xff1a;光流&#xff0c;主要包含运动信息&#xff0c;处理…

面向对象分析与设计 UML2.0 学习笔记

一、认识UML UML-Unified Modeling Language 统一建模语言&#xff0c;又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开发阶段&#xff0c;说明、可视化、构建和书写一个面向对象软件密集系统的制品的…