我的第一篇rust博客

接触rust是在一个前端的群里,群主推荐的。混群很久都没有引起我的注意,直到有一次百度了解,才发现它的魅力。而且它是WebAssembly首推的编程语言,自然有它的独特之处。
rust标榜内存安全和线程安全,并且并不是虚拟机语言,不存在垃圾回收。基本上就是可以兼顾虚拟机语言的自由和非虚拟机语言的速度,当然有得有失,带来的缺点就是语法丑陋,难以掌握,这对于它带来的好处来说都不是事儿。
rust的内存安全和线程安全实现机制就是独占内存资源的所有权,任何时候只允许只有一个变量(可以是变量的引用)对内存进行修改,并且引用是有生命周期的,编译器会约束引用的使用,它在原始变量释放内存之前必须归还,以杜绝垂悬指针,不按规则使用,就会编译不通过。
第一篇rust博客就是关于引用生命周期的,直接贴一段错误代码,从数据库操作中分离出来的。

 1 struct Person {
 2     pub name: String,
 3     pub addr: String
 4 }
 5 fn addVal<‘a>(vals: &‘a mut Vec<&‘a str>, person: &‘a Person) {
 6     vals.push(&person.name);
 7     vals.push(&person.addr);
 8 }
 9 fn print(vals: &[&str]) {
10 }
11 fn main() {
12     let person = Person {
13         name: String::from("name"),
14         addr: String::from("addr")
15     };
16     let mut vals: Vec<&str> = Vec::new();
17     addVal(&mut vals, &person);
18     print(&vals);
19 }

按此代码编译不通过,编译报错如下:

   Compiling train v0.1.0 (E:\code\git\train)
warning: unused variable: `vals`
 --> src\main.rs:9:10
  |
9 | fn print(vals: &[&str]) {
  |          ^^^^ help: consider prefixing with an underscore: `_vals`
  |
  = note: `#[warn(unused_variables)]` on by default

error[E0502]: cannot borrow `vals` as immutable because it is also borrowed as mutable
  --> src\main.rs:18:11
   |
17 |     addVal(&mut vals, &person);
   |            --------- mutable borrow occurs here
18 |     print(&vals);
   |           ^^^^^
   |           |
   |           immutable borrow occurs here
   |           mutable borrow later used here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0502`.
error: could not compile `train`.

To learn more, run the command again with --verbose.

此处报错addVal调用的时候借用了一个可变引用,之后的print方法又借用了一个共享引用,但是并不是同时借用的,一先一后,按常理,addVal处的借用应该在调用之后就归还所有权,并不违反rust借用规则检查,但是编译就是不过。在排查问题的时候把问题的焦点放到了addVal方法的vals和person参数上了,看漏了一个vals的元素也是引用,由于vals的元素是引用,所以vals向量的生命周期应该小于借用关系的生命周期,而vals到main函数的结尾都还存活,所以借用关系至少要持续到函数结尾,又由于vals的借用和vals的元素声明成了相同的生命周期,所以vals的借用关系也是持续到main函数结尾的,所以,一直处于借用状态,并没有归还,不能再借用共享引用,导致编译报错。
最后经过大佬点播,把vals引用参数和vals的元素生命周期声明成不同的生命周期,就通过编译了。
最后addVal函数的签名为:

fn addVal<‘a, ‘b>(vals: &‘a mut Vec<&‘b str>, person: &‘b Person)

rust是我目前遇到的最值得学习的编程语言,我对它的喜爱超过了之前的lua,路漫漫其修远兮,继续探索之路。

原文地址:https://www.cnblogs.com/omega8/p/12218687.html

时间: 2024-10-25 05:54:33

我的第一篇rust博客的相关文章

15篇干货博客 38本书 4门公开课 减掉20斤体重 我的2014总结

欢迎关注我的新博客地址:http://cuipengfei.me/ 2014年即将结束,需要做一些总结. 既然总结是写在博客上的,第一项就先说博客吧. 博客 2014年写了18篇博客,其中15篇和Scala有关,自认为都是有且仅有干货的. 对此,我比较满意. 不过这个数字存在欺骗性,15篇Scala的博客,其中4篇写于1月份,6篇写于6月份,其余的零散的写就与其他月份. 66.66-%集中地爆发于两个月里,其余十个月只贡献了总体的33.33-% 可见写博客这件事于我而言并没有形成持久的习惯,只是

python+scrapy分析博客园首页4000篇优质博客(图解)

1.侵删 本文数据是获取的博客园首页的4000条数据,为了不对博客园服务器造成压力,所以源码不会公开,在此,敬请博客园官方团队放心. 获取到的数据从2019-7-11到2019-9-12,此数据也不会公开. 由于会涉及到一些博主的数据,所以有博主不愿公开数据,联系我及时删除. 2.先上数据分析结果 写文最多的博主top6 ---->(最勤劳的博主)?(′?`*) 黑白影-->发文54篇 周国通-->发文38篇 宜信技术-->发文30篇 削微寒-->发文28篇 泰斗贤若如--&

Ceph相关博客、网站(256篇OpenStack博客)

官网文档: http://docs.ceph.com/docs/master/cephfs/ http://docs.ceph.com/docs/master/cephfs/createfs/   (创建cephfs文件系统) ceph官方中文文档: http://docs.ceph.org.cn/ openstack中的配置: http://docs.ceph.com/docs/master/rbd/rbd-openstack/ 博客等: http://blog.csdn.net/dapao1

python3进阶开发-第一个仿博客园的项目(1)

首先我们要设计一下表结构: UserInfo(用户信息表) -------->一对一    ----------->Blog(博客信息表) UserInfo(用户信息表) --------->一对多    ----------->Article UpDown(点赞表) UserInfo(用户信息表) --------->一对多    ----------->Article Comment(评论表) UserInfo(用户信息表)---------->一对多   

软件工程第一周开课博客

日期:2019.3.9 博客期:040 星期六 这一周我们的软件工程概论课终于是开了,老师给我们看了PPT,看着创建时间 2013-2-26 ,这样看来是我们老师很看重这个时隔 6 年多的PPT啊! 1.那么我就向各位前辈们介绍一下自己吧! 我,今年是编程2年经验,深入研究的语言有C语言.C++.Java语言.HTML框架.CSS格式.Java Script.汇编语言,目前正在学习 PHP.Python语言和易语言.对于自己曾经制作的作品,我就简单的说几个吧!在1年前,我使用C语言写了井字棋.扫

就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会

一.指向结构体变量的指针变量 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可.例如:        struct person            { charname[20];             char sex;             int age;             float height;            };       struct person *p;则指针变量p,它可以指向struct person类

我的第0篇技术博客

不知不觉,走出校门将近5年了,最近突然觉得自己白白的浪费掉了这将近5年的时间.一直以来,就只想着能够找到一份工作,就OK了,也不知道自己为什么要做这份工作,也不管这份工作有没有前途,如果工作稍微累点,还满肚子的怨言.在这样的思想中,不知不觉走过了将近5年,最近突然幡然醒悟,觉得不能够再这样下去了,应该为自己的将来打算,应该要有自己的工作积累,所以,我开始写blog. 真是惭愧,工作了这么久了,居然没有想到去写blog,以前是多么的懒啊,现在回想都觉得汗颜啊.

WINDOWS操作系统中可以允许最大的线程数(线程栈预留1M空间)(56篇Windows博客值得一看)

WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,

第39篇 免费博客github Pages绑定域名

原文地址:http://blog.laofu.online/2017/06/02/how-bind-domain/ 网站已经有了,需要对网站来绑定一个自己的个性域名,本人是买了一个阿里云的域名,也就是现在正在使用的laofu.online.当然这个是主域名,我们需要是是一个带有含义的二级域名,这里我添加一个blog.laofu.online的域名. 映射记录的添加 买了域名后,阿里云会有一个后台,这里我们需要把现在的域名转发到我们github-pages所生成的网站.这里我们只需要添加一个CNa