对rust语言的一些理解

近来在研究rust语言,作为老牌的C++程序员及拥有近10年经验的java程序员,觉得有必要通过语言间的对比来加深对rust的理解。

环境

安装

rust安装是区分操作系统和ABI的,比如我的是windows+gnu ABI,主要是懒得安装VC

几个重要工具

rustc类似于 gcc

rustup:rust工具链管理,工具链包括:rustc编译器、标准库、cargo等,工具链也是区分平台和底层ABI的。

cargo类似于java的maven,toml类似于maven的pom,crate就是java里的artifact。cargo里的registry类似于maven远程仓,只不过registry是复用git组织的,其中的crate都是通过git下载。

内源crate仓

如要使用非官方crate仓,cargo的config文件可以这样配置:

[source.crates-io]
replace-with = 'mirror'
[source.mirror]
registry ="https://XXX.com/rust/crates.io-index/"

假设我们在toml文件里增加了libc依赖:

[dependencies]
libc = "0.2.153"

键入cargo build命令,cargo会自动为我们下载三方依赖。下载的三方依赖会放到.cargo/registry下的cache和src目录,前者是二进制包(后缀为.crate),后者是三方件源码。

rust标准库

rust标准库则使用rustup安装,下载路径为(我的环境使用了windows gnu ABI):

.rustup\toolchains\stable-x86_64-pc-windows-gnu\lib\rustlib\src\rust\library

IDE

可以下载jetBrain的RustRover,因为使用非官方仓,所以要记得把RustRover里的http proxy禁用,不然crate可能下不下来。

语言

推荐rust入门中文教程链接:

https://kaisery.github.io/trpl-zh-cn/ch02-00-guessing-game-tutorial.html
除了介绍语法,还会讲一些语言设计上的考虑,值得细读。

个人理解

let默认定义的是不变量,而非其它语言那样是个可变量。

专门用mut关键字表示可变量(mutable)。之所以提出这个关键字,是因为并发编程下,const是万善之首,mutable是万恶之源,rust编译器要特别关注mut的情况,并对其使用作出一定的限制。

rust没有异常,使用Result枚举+match来处理结果。本质上是C的错误码那一套。C的那一套,我个人是不太喜欢的,这种约束意味着程序员要花费过多精力去关注错误,代码整体可读性会比较差。不过rust针对这种情况,提供了?运算符,可以极大简化错误处理的套路代码,算是对代码可读性的一个补偿。

rust里的对象,用引用传递(rust术语叫borrow,借用)没问题,用值传递会导致所有权转移,本质上类似于C++里的auto_ptr。相当于把C++里标准库的能力下沉到语言层面,这样编译器就能发挥提前示警的作用(比如给出value move错误),在C++里,因为auto_ptr只是库的能力,C++编译器对value move的风险自然无从感知。另外,对象的传递,要么引用、要么所有权转移,尽量减少C++那样的拷贝构造开销(即value copy),效率上也会更高。

具体到String这个类,从功能的角度看,rust里的String等价于java的StringBuilder, &str才等价于java的String(java里String是不可变的);从资源管理的角度看, rust的String类似于C++里的std::auto_ptr<std::string>(std::string底层实现也是一个堆上的字符数组),&str接近于const std::string&。所以rust的引用操作符作用相当于C++的*(std::auto_ptr.get())。

rust里的drop函数等价于C++的析构函数(destructor),能做到超出范围的对象自动释放内存(资源分配即初始化,RAII)。表面上就像有gc一样。一开始我还奇怪rust应用层里怎么没有内存释放的代码呢。

rust语言的设计原则,一言以蔽之:预防性编程,宁杀错不放过。比如有些immutable borrow+mutable borrow+immutable borrow的场景,其实执行的时候不一定会出错(因为mutable borrow也可能只用来做只读操作,并不真的修改对象,见下例),但rustc为了避免后续可能的错误,还是会让你的代码编译失败。如此严格的编译规则,你想犯错都不容易。

fn dangle() -> String {let mut s = String::from("hello");let s1 = &s;  // immutable borrow occurs herelet s2 = &s;let s3 = &mut s;  // mutable borrow occurs here, error!println!("{}", s1); // immutable borrow later used hereprintln!("{}", s3);s
}

slice是对一段连续内存中部分区域的引用,它的出现,一方面是编程的易用性、安全性考虑,一方面也是为了性能。设想一个常见场景:对一个字符串按特定符号分割出一个列表,然后对这个列表做遍历。在java里就只能用substring方法复制出一组小的字符串来。因为我们遍历是只读的,这个复制小字符串的行为其实很浪费内存,在C或C++中完全可以在char*数组中用下标前移的做法来遍历,从而节省额外拷贝的开销,提高效率。rust的slice就是上述两者的一个折中,既保证了java那样的易用性、封装性,又兼顾了C和C++做法的效率。是一个非常好的设计。从slice的设计上,可以猜测,rust性能号称对标C,当非虚妄。

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

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

相关文章

发那科数控机床远程监控数据上云

发那科数控机床远程监控数据上云 在当今数字化、网络化的工业生产环境中&#xff0c;发那科数控机床作为全球领先的高端制造设备之一&#xff0c;其远程监控数据上云已成为实现智能制造、提升生产效率和优化资源管理的重要手段。本文将深入探讨发那科数控机床远程监控数据上云…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式&#xff0c;也就是异步网络模式&#xff0c;允许事件驱动…

axios异步操作第一篇

1 同步请求和异步请求 客户端给java后台程序发送请求&#xff0c;发送请求的方式有两种&#xff1a; 同步请求 同步请求发送方式&#xff1a; 1 浏览器地址栏&#xff0c;输入url&#xff1a;http://localhost:8080/web-app/xxxServlet 2 3 删除 4 javascript:location.hr…

golang不知道参数类型的情况下通过反射调用函数或方法

场景是回调N多函数或方法&#xff0c;且不知道具体的函数和参数&#xff0c;只有回调指针和无类型参数列表。 reflect_func.go: package mainimport ("fmt""reflect" )func fn(p1, p2, p3 int) int {return p1 p2 p3 }func main() {typeFunc : reflect…

springboot+excel导入导出相关

在我们日常研发工作中很多的地方需要用到导入导出excel的功能&#xff0c;在这里我将需要的代码进行总结方便自己也方便别人。 一、导出篇&#xff1a; 1.首先我们需要pom文件中配置上需要的maven包 <dependency><groupId>cn.afterturn</groupId><artifac…

运营商的mpls专线

在当今高速发展的数字化时代&#xff0c;网络已成为企业发展不可或缺的基础设施。作为企业网络 连接的重要组成部分&#xff0c;MPLS专线在运营商的推动下逐渐成为了企业选择的首选。 MPLS&#xff08;Multi-Protocol Label Switching&#xff09;是一种基于标签的交换技术&am…

探索渲染农场的高性能奥秘

在当今数字化的时代&#xff0c;渲染农场正逐渐成为许多行业不可或缺的强大工具。那么&#xff0c;为什么我们说渲染农场是高性能的计算机系统呢&#xff1f;让我们深入剖析其中关键要点。 “渲染农场”拥有大规模的计算资源。它由众多高性能的计算机节点组成&#xff0c;这些…

理解伽马分布

伽马分布 关键词&#xff1a;Gamma Distribution 文章目录 一、说明二、Gamma 分布的基础概念2.1 Gamma 分布的物理意义2.2 对比泊松与伽马分布2.3 伽马分布参数 三、具有伽马分布的高效牙科调度四、后记 一、说明 在本文中&#xff0c;我们将探讨统计学中的基本概率分布之一…

三种基本排序-冒泡,选择,二分

闲话不多说&#xff0c;直接上代码&#xff0c;简明易懂&#xff0c;条理清晰&#xff0c;交互性强&#xff0c;尽善尽美 码住&#xff0c;建议copy下来&#xff1a; 先上二分法吧&#xff0c;稍复杂点的&#xff0c;代码多一些&#xff0c;用了函数调用 二分排序&#xff1…

【C++】命名空间、缺省参数、函数重载、引用

文章目录 1.认识命名空间2.命名空间的使用3.C的输入和输出4.缺省参数4.1缺省参数的概念4.2缺省参数的分类 5.函数重载6.引用6.1引用的概念6.2引用的特性6.3常引用(重点题目)6.4引用和指针的区别 1.认识命名空间 C总计63个关键字&#xff0c;C语言32个关键字 下面让我们学习一…

周进院长受邀出席2024第四届屈光手术国际论坛获多项荣誉称号!

周进院长受邀出席2024第四届屈光手术国际论坛获“全国首批EVOICL&#xff08;V5&#xff09;新技术临床应用专家”等多项荣誉称号&#xff01; 5月10-12日&#xff0c;由爱尔眼科医院集团主办、长沙爱尔眼科医院协办的2024第四届屈光手术国际论坛&#xff08;IRSS 2024&#x…

618洗地机怎么选?热门洗地机选购指南,拒绝踩雷

洗地机是一种智能化的清洁工具&#xff0c;具有超强的清洁能力&#xff0c;能轻松应对各种地面污渍&#xff0c;无论是干污还是湿污。其一键操作设计简便易上手&#xff0c;省去了传统清洁方式的繁琐步骤&#xff0c;节省了时间和精力。高端型号更配备智能感应功能&#xff0c;…

2024/5/13 SpringBoot配置多个RabbitMQ

目录 一、单个RabbitMQ配置 1.1、导入Maven坐标 1.2、yaml配置 1.3、java配置类 1.3.1、交换机配置 1.3.2、队列配置 1.3.3、绑定配置 1.3.4、连接配置 1.4、生产者与消费者操作配置 1.4.1、生产者操作配置 1.4.2、消费者操作配置 二、多个RabbitMQ配置 2.1、yaml配置 2.2、j…

【漏洞复现】瑞友天翼应用虚拟化系统 appsave SQL注入漏洞

0x01 产品简介 N/A 0x02 漏洞概述 瑞友天翼应用虚拟化系统 appsave接口存在SQL注入漏洞,未授权的攻击者可以通过该漏洞执行任意sql语句。 0x03 测绘语句 fofa: body="瑞友天翼 - 应用虚拟化系统" 0x04 漏洞复现 1、执行sql语句:http://xxxx/hmrao.php?s=/Ad…

ARP中间人

文章目录 ARP中间人ARP协议介绍使用kali进行ARP毒化使用kali进行ARP中间人使用kali进行ARP钓鱼ARP攻击防御ARP总结 ARP中间人 ARP协议介绍 维基百科ARP介绍 ARP&#xff08;地址解析协议&#xff09;在网络通信中扮演着至关重要的角色&#xff0c;它通过将网络层地址&#x…

吴恩达机器学习笔记:第 10 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 10 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 10 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型&#xff0c;增加数据集的规模可以帮助你获得更…

大模型LLM 结合联网搜索增强isou

参考&#xff1a; https://isou.chat/ https://github.com/yokingma/search_with_ai 安装github下载&#xff0c;运行docker compose 如果一直报下面错误&#xff1a; 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&#xff1a; http://192.16***…

系统网络基础知识介绍

1.路由 路由是指从原地址到目的地时&#xff0c;决定端到端路径的网络范围的进程&#xff0c;是工程术语。路由工作在OSI参考模型的第三层&#xff08;网络层&#xff09;&#xff0c;是数据包转发设备。12 路由是把数据从一个网络转发到另一个网络的过程&#xff0c;这个…

教练预约管理小程序开发源码现成案例(小程序、APP、H5圆源码搭建)

随着人们对身体健康越来越重视&#xff0c;对强身健体、健康个性化生活的需求日益增加&#xff0c;健身已成为时尚生活的标志。 然而&#xff0c;没有时间去健身房却成了很多上班族的痛点。健身房作为一项既能缓解工作压力又能缓解学业压力的运动&#xff0c;正好满足了当代人…

每日OJ题_贪心算法四⑦_力扣1054. 距离相等的条形码

目录 力扣1054. 距离相等的条形码 解析代码 力扣1054. 距离相等的条形码 1054. 距离相等的条形码 难度 中等 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相邻的条形码不能相等…