3604|19

6386

帖子

8

TA的资源

管理员

楼主
 

《Rust实战》书友互动第二集:Rust语言基础 有何不同? [复制链接]

 

《Rust实战》书友互动第一集:Rust语言你知多少

总结角色的@nemon说,第二章应该放在第一章节看,否则没有语言基础,直接看第一章节,会很难理解。

所以,第一章看到爆炸的网友,不要气馁,愉快的开启我们的第二章节之旅。

 

 

演绎时间:即日起至4月21日
脚本限定:《Rust实战》第二章 Rust语言基础
 
角色分配:
提问角色(4位)和解题角色(4位)、总结角色(2位),下方跟帖第一位书友嘉宾是提问角色,第二个是解题角色,解答第一个提问,解答完后,解题角色可以继续提问,也可以不提问,结束一次问答循环。后面参与继续新起问答接龙即可,最后2位是章节总结角色,以文字或者思维导图的形式,对本章进行总结,至此一次互动结束。注意:提问角色发布的问题,要求能在第一章节书中有迹可循,且对解题者理解、学习Rust有切实意义;提问角色所发布的问题不可重复。
 
《Rust实战》吃螃蟹的书友们,我们继续互动成长啦~
 
 
 
 

活动交流群

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

 

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

JetBrain党,我是vscode党,我推荐使用 谁用谁知道,很舒服 [attach]803932[/attach]       详情 回复 发表于 2024-4-22 16:43
点赞 关注
个人签名微信搜索公众号“EEWORLDBBS”快去添加关注吧!

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 

Rust的for循环,与C中的for循环有什么不同?

 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

板凳
 

rust的for,更像python,使用for item in container的形式(当然循环体还是要用大括号括一下的)。

但是为了安全,默认不允许修改,如果想改,要写成 for item in &mut container。

而且,如果你觉得item没用,可以像python一样,用下划线“_”来代替。

 
 
 

回复

288

帖子

0

TA的资源

一粒金砂(高级)

4
 

Rust的是否有指针的概念?如果没有,传递数据通过全局变量吗?

点评

Rust确实有指针的概念,但它通过引用和可变引用来实现,比传统指针更安全。Rust不推荐使用全局变量来传递数据,而是鼓励通过函数参数和返回值来传递,以确保代码的可维护性和内存安全。  详情 回复 发表于 2024-4-21 22:22
 
 
 

回复

4771

帖子

12

TA的资源

版主

5
 

提问:

如下代码结果是什么?

fn main{
	assert!(0.1 + 0.2 == 0.3)
}

那如下这段代码呢?

fn main{
	assert!(0.5 + 0.25 == 0.75)
}

 

点评

第一段会报错 PS D:\Rust\demo> cargo run    Compiling demo v0.1.0 (D:\Rust\demo)     Finished dev target(s) in 0.31s      Running `target\debug\demo.exe` th  详情 回复 发表于 2024-4-16 07:49
 
 
 

回复

6841

帖子

11

TA的资源

版主

6
 
吾妻思萌 发表于 2024-4-15 22:33 提问: 如下代码结果是什么? fn main{ assert!(0.1 + 0.2 == 0.3) } 那如下这段代码呢? ...

第一段会报错

PS D:\Rust\demo> cargo run
   Compiling demo v0.1.0 (D:\Rust\demo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s
     Running `target\debug\demo.exe`
thread 'main' panicked at src\main.rs:4:5:
assertion failed: 0.1 + 0.2 == 0.3
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

第二段可以正常的通过。

究其原因,因为浮点数是一个近似数,在计算机系统里面,如果使用的是64位系统,其实0.1+0.2是不会与0.3相等的,所以会在运行时发生崩溃。

 
 
 

回复

1124

帖子

1

TA的资源

五彩晶圆(初级)

7
 

在python里,0.1+0.2 == 0.3 返回的也是False

0.5+0.25==0.75 返回True

反过来,用0.3-0.1结果为0.19999999999998,也不对于0.2

究其原因,其实是因为浮点数据表示是采取科学计数法,0.1,0.2,0.3的二进制表示,后面有尾巴

0.5+0.25==0.75是因为其二进制表示后面没有尾巴,所以能准确相等

 

 

 

 

 
 
 

回复

1124

帖子

1

TA的资源

五彩晶圆(初级)

8
 

从这个角度看,其实与语言无关,不管什么语言,这两个式子的表达其实结果应该都一样

 
 
 

回复

2870

帖子

4

TA的资源

五彩晶圆(中级)

9
 

Rust的for循环的控制是通过枚举实现的,rust强调循环过程的可控性,实现的方法是通过控制“容器”的枚举来实现,而不是使用象C语言中的变量比较的方案。C语言的循环中如果修改了变量的值,那么过程就可能不可控了,可能你疑惑C语言的变量只要我在循环中不修改它就可以了,为啥还回不可控能,这在单任务中的确是你希望的,但是在复杂的多任务中就不好说了。

int i;

for(i=0;i<length;i++)
{
//单任务没事
......

}

多任务中可能i就被其它的线程修改了。

for(int i;i<length;i++)
{
//多任务也没事
.......

}

但是这是C语言的新语法结构。

 
 
 

回复

4771

帖子

12

TA的资源

版主

10
 
yangjiaxu 发表于 2024-4-15 21:18 Rust的是否有指针的概念?如果没有,传递数据通过全局变量吗?

Rust语言中有指针的概念,但与其他语言不同,Rust中的指针分为两种类型:引用和裸指针。

  1. 引用(References):引用是Rust中最常见的指针形式,它们允许你借用数据而不拥有它。引用在Rust中使用&符号来表示。引用遵循借用规则,可以是可变的(&mut T)或不可变的(&T),这取决于你是否允许修改数据。

  2. 裸指针(Raw Pointers):裸指针与引用不同,它们允许你直接操作内存,但是没有借用规则的保护。裸指针通常用于与C代码交互或者在极端情况下需要手动管理内存时使用。裸指针使用*符号来表示,分为不可变裸指针(*const T)和可变裸指针(*mut T)。

  3. 智能指针(smart Points) 智能指针和引用的一个重要区别在于,引用只借用数据,而很多时候智能指针拥有数据。

在Rust中,传递数据通常不通过全局变量,而是通过函数参数或返回值来传递。这样做有助于提高代码的可读性、可维护性和安全性。可以使用引用或裸指针将数据传递给函数,并在需要时进行所有权转移或借用。

 
 
 

回复

4771

帖子

12

TA的资源

版主

11
 

提问:

如下代码中,第四行的x + 1为何没有号啊???

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

点评

因为是返回,所以没有分号。这个在表达式那里详细的说明。  详情 回复 发表于 2024-4-22 15:13
 
 
 

回复

501

帖子

4

TA的资源

纯净的硅(高级)

12
 

let x = 3; 带分号表示语句,语句无返回值

x+1无分号表示表达式,表达式有返回值。

{}也是表达式,其值是最后一个表达式的值,即最后必须是表达式,所以不能是x+1;(即语句)。

{}块表达式其中语句按顺序执行,所以先执行let x=3;语句最后表达式x+1的值作为整个{}表达式的值,

所以最后y为4.

 

最后的结果是打印

The value of y is: 4

 

 
 
 

回复

44

帖子

1

TA的资源

一粒金砂(中级)

13
 
yangjiaxu 发表于 2024-4-15 21:18 Rust的是否有指针的概念?如果没有,传递数据通过全局变量吗?

Rust确实有指针的概念,但它通过引用和可变引用来实现,比传统指针更安全。Rust不推荐使用全局变量来传递数据,而是鼓励通过函数参数和返回值来传递,以确保代码的可维护性和内存安全。

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

14
 

这周由我来给大家总结:本章是学习语言的经典开头(hello world):第一个rust程序的编写,实践了单文件编译和cargo项目编译的方式。了解了rust支持的基本语法结构和数据类型,这部分的绝大多数内容在其它语言都能找到,所以理解起来不难。


出现了一个比较重要的指标:能否在编译期计算出某个数据类型在运行过程中占用的内存空间的大小。如果能计算出,就是固定尺寸数据类型,如果不能计算,那就是动态数据类型。因为rust要尽量在编译期间多做一些事情,安全性检查等,所以只有计算出内存尺寸的数据类型,才能被更详细的分析检查。


给大家一个思考题:rust能实现python中那种无限大小的数字类型以及js中bumber那种通用的数字类型吗?


点评

写rust的IDE推荐一波RustRover,jetbrains新出的,现在可以免费使用  详情 回复 发表于 2024-4-22 16:33
斗胆来答,估计不一定对 我看了似乎Rust在数据的类型上有些限制,想要实现无限大小的数字类型似乎不现实。 可能u128可以达到一个非常大的数字。 [attachimg]803890[/attachimg]   似乎u256是不可以  详情 回复 发表于 2024-4-22 15:47
 
 
 

回复

6841

帖子

11

TA的资源

版主

15
 
吾妻思萌 发表于 2024-4-16 16:28 提问: 如下代码中,第四行的x + 1为何没有;号啊??? fn main() { let y = { let ...

因为是返回,所以没有分号。这个在表达式那里详细的说明。

点评

随着深入,这个我也看到啦。 果然得细细看啊  详情 回复 发表于 2024-4-22 15:41
 
 
 

回复

4771

帖子

12

TA的资源

版主

16
 
lugl4313820 发表于 2024-4-22 15:13 因为是返回,所以没有分号。这个在表达式那里详细的说明。

随着深入,这个我也看到啦。

果然得细细看啊

 
 
 

回复

4771

帖子

12

TA的资源

版主

17
 
ltaodream 发表于 2024-4-22 11:18 这周由我来给大家总结:本章是学习语言的经典开头(hello world):第一个rust程序的编写, ...

斗胆来答,估计不一定对

我看了似乎Rust在数据的类型上有些限制,想要实现无限大小的数字类型似乎不现实。

可能u128可以达到一个非常大的数字。

 

似乎u256是不可以的。

 

点评

    rust 中的数值类型需要在编译时就确定它们的类型和大小,这些类型可以通过使用 rust 内置的类型注解,或是灵活的小数点和后缀表示法来声明。而crates.io上有 num crate 可以用来表示通用的  详情 回复 发表于 2024-4-22 16:31
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

18
 
吾妻思萌 发表于 2024-4-22 15:47 斗胆来答,估计不一定对 我看了似乎Rust在数据的类型上有些限制,想要实现无限大小的数字类型似乎不现 ...

    rust 中的数值类型需要在编译时就确定它们的类型和大小,这些类型可以通过使用 rust 内置的类型注解,或是灵活的小数点和后缀表示法来声明。而crates.io上有 num crate 可以用来表示通用的数字类型,具体是通过 trait 机制来实现的。
    至于py中无限大小的数字类型,rust 不直接支持这个特性,但可以通过使用第三方库来实现。常用的第三方库包括rug和num-bigint等,提供了实现高精度计算的数据类型和函数,可以处理更大的整数和浮点数。采用的是类似于py的动态内存分配和存储机制,能够进行几乎无限大小的数字计算

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

19
 
ltaodream 发表于 2024-4-22 11:18 这周由我来给大家总结:本章是学习语言的经典开头(hello world):第一个rust程序的编写, ...

写rust的IDE推荐一波RustRover,jetbrains新出的,现在可以免费使用

 
 
 

回复

4771

帖子

12

TA的资源

版主

20
 
ltaodream 发表于 2024-4-22 16:33 写rust的IDE推荐一波RustRover,jetbrains新出的,现在可以免费使用

JetBrain党,我是vscode党,我推荐使用

谁用谁知道,很舒服

 

 

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表