网易首页 > 网易号 > 正文 申请入驻

千万别学Rust!

0
分享至

  张大胖被别人安利了一个新的语言:Rust,说是将来会替代C语言,就连Linux都要使用Rust了。

  作为编程语言的狂热爱好者,他自然要尝试一番。

  第一个程序自然是hello world,太简单了,都懒得去写,看看就行了:

  fnmain(){ println!("helloworld"); }

  张大胖原来用过C语言, 当时觉得非常不爽的是它本身没有内置常用的数据结构,比如一个可以动态增长的数组,这Rust怎么样呢?

  fnmain(){ letv=Vec::new();//创建了一个数组 v.push(4);//向数组添加一个元素 }

  张大胖写下let就意识到,这里是将值(数组)绑定到变量v , 应该是借鉴了Lisp的模式匹配,可以预见将来会遇到这样的代码:

  let(name,age)=("Andy",30);

  还有就是这Rust具备自动类型推断能力,这点挺不错的。

  编译吧!咦,居然失败了,错误信息是:cannot borrow `v` as mutable, as it is not declared as mutable

  Rust编译器:我们把对象分为可变的和不可变的,对于不可变的,一旦创建以后,就不能再改了。那就加个关键字mut,让它变成可变的就可以了:let mut v = Vec::new()

  张大胖想起了《effective java》中的一条实践:把可变性限制到最小。他嘴里咕哝着:“嗯,Rust默认是不可变,这个思路也许是对的。”

  所有权

  他又探索着写下一些代码:

  fnmain(){ //用另外一种方式创建了一个可变Vector letmutv=vec![1,2]; letv1=v; println!("the1stelementis{}",v[0]); }

  编译,又失败了,WTF!到底是怎么回事?这么简单的程序也会出错?!

  Rust编译器:谁让你手贱!加了一行代码:let v1 = v

  张大胖:这有什么关系?在Java中,这就相当于对同一个对象,又添加了一个引用而已

  Rust编译器:那是Java,在我Rust这里,你一定要放下Java的执念!要理解一下所有权的问题。

  张大胖:什么所有权?

  Rust编译器:对于任何给定的对象都只有一个绑定与之对应。你用let mut v = Vec::new()就意味着 v 和这个Vector对象绑定了!现在v拥有这个对象的所有权。这一行代码 let v1 = v ,让所有权发生转移了, 现在v1是新主人了。v就不能再访问这个Vector, 我把这种情况叫做“转移语义”。

  码农翻身注:实际上, Rust也支持Copy语义,这里不在详述。

  张大胖不满地说:这不是徒增烦恼吗?那我要是把v传递给另外一个函数呢?

  fnmain(){ letmutv=vec![1,2,3,4];//创建了一个可变Vector print_vector(v); println!("the1stelementis{}",v[0]); } fnprint_vector(v:Vec ){ foriinv{ println!("{}",i); } }

  编译还是出错!

  Rust编译器:这和刚才是一个道理,v的所有权在传递给函数时,被拿走了,所以在main中不能再访问v了 !

  借用

  张大胖:太变态了,我就是想在调用print_vector以后想访问再访问变量v,该怎么办?

  Rust编译器:你可以把所有权暂时借用(&v)给print_vector,等函数返回就可以接着使用了

  fnmain(){ letmutv=vec![1,2,3,4];//创建一个可变Vector print_vector(&v); println!("the1stelementis{}",v[0]); } fnprint_vector(v:&Vec ){ ...... }

  这个借用就相当于Java语言的引用了,张大胖想,print_vector函数已经“借到”所有权,应该可以为所欲为了吧,于是在函数内做了修改:

  fnprint_vector(v:&Vec ) { v.push(3); ..... }

  再次编译,再次失败!张大胖感觉到要吐血了,这Rust实在太不讲道理了。

  Rust编译器:“你这个借用想要改变原来的对象,也得加上 &mut才行!”

  fnmain(){ letmutv=vec![1,2,3,4];//创建了一个Vector print_vector(&mutv); println!("the1stelementis{}",v[0]); } fnprint_vector(v:&mutVec ){ v.push(3); ...... }

  总结一下:

  张大胖继续写代码,想继续测试这个所谓“借用”:

  fnmain(){ letmutx=String::from("hello"); letx1=&x; letx2=&mutx; println!("{}",x1); }

  编译还是出错:‘x’已经有一个不可变借用了,不能再以可变的方式来借用!

  张大胖彻底懵逼了!

  想我叱咤编程界多年,先后学会了C,C++, Java, Ruby ,Python, 从来就没见过这么复杂的语言,这么简单的程序,编译都通不过。

  Rust编译器:道理很简单,x1是不可变引用,x2是可变引用,使用x1的"用户"可不希望访问x1时,数据已经改变了。我告诉你一个简单的口诀,以后再遇到问题就迎刃而解了:共享不可变, 可变不共享。

  (用严格的描述来说是这样:同一时刻,要么只有一个可变(&mut)借用,要么有多个不可变(&) 借用,不能同时存在可变和不可变借用。

  (都对一个对象做读操作,安全!)

  (只有小张可以写,因为他是可变的借用)

  张大胖琢磨了一下,这口诀用人话来说是这样的:当大家都在读一个东西的时候,是不能写的。当一个人在写的时候,别人是不能读的, 这不就是经典的读写锁问题吗?这Rust居然在编译器级别做了这种限制 !

  Rust编译器:我之所以由这么严格的限制,就是为了内存安全,我的这套体系是不需要GC的,只要你能按照我的规矩来,内存安全就能保证。

  张大胖:你啊,是为了懒省事,把本来可以让虚拟机干自动做的事情,都交给程序员来做了,这是要把我们累死啊!

  Rust编译器:你到底做过系统级编程没有?系统级编程要求:

  1. 非常快

  2. Runtime 很小(虚拟机就是一个巨大无比的Runtime)

  3. 能直接访问内存,并且内存安全。

  C和C++基本满足,但是内存不安全, 像Java, Python,Ruby 除了内存安全之外,别的都不满足,只适合应用层编程。

  张大胖无语了,这家伙的目标是要替换C/C++,自己也写过不少C代码,由于内存问题,不知道搞垮过多少个程序,悬空的指针就像幽灵一样到处飘荡,无踪可循,然后在一个未知的地点,未知的时刻突然爆裂。

  这个Rust,每个对象都有唯一的“主人”,然后有对读写施加了这么严格的限制,如果程序员掌握了,确实比C语言安全, 我还是接着学吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
上海局部突发冰雹黄色预警,当前四区雷电黄色预警高挂!这些区域下班赶紧回家

上海局部突发冰雹黄色预警,当前四区雷电黄色预警高挂!这些区域下班赶紧回家

新民晚报
2026-05-12 19:04:25
湖人重建目标曝光:里夫斯成头号副手,中锋和侧翼调整模板浮现

湖人重建目标曝光:里夫斯成头号副手,中锋和侧翼调整模板浮现

新杀猪的秀才
2026-05-12 21:20:20
上汽MG 4X正式开启全国盲订!外观动感,配半固态电池,续航610Km

上汽MG 4X正式开启全国盲订!外观动感,配半固态电池,续航610Km

小史谈车
2026-05-11 21:38:08
日本人民要求归还北方领土是正当的民族权利 76年3月16日人民日报

日本人民要求归还北方领土是正当的民族权利 76年3月16日人民日报

那些看得见的老照片
2026-05-09 10:09:44
医生:糖尿病最危险信号,不是消瘦,而是频繁出现这4种异常

医生:糖尿病最危险信号,不是消瘦,而是频繁出现这4种异常

汪医生健康百科
2026-05-11 19:25:06
老天暗示你要发财,99%的人却都视而不见

老天暗示你要发财,99%的人却都视而不见

金沛的国学笔记
2026-04-20 20:13:27
45岁阿娇现身活动,胯粗屁股大身高是硬伤,五官精致立体像18岁

45岁阿娇现身活动,胯粗屁股大身高是硬伤,五官精致立体像18岁

往史过眼云烟
2026-05-11 19:27:04
任何一个男人到了六十岁后,只要还对异性怀有欣赏与追求,往往因为这两件事

任何一个男人到了六十岁后,只要还对异性怀有欣赏与追求,往往因为这两件事

心理观察局
2026-05-04 08:51:11
阿勒代斯:VAR不该吹掉铁锤绝平,阿森纳类似情况获利无数次了

阿勒代斯:VAR不该吹掉铁锤绝平,阿森纳类似情况获利无数次了

懂球帝
2026-05-13 01:09:14
吴君如很早就说过了,陈妍希私下就是这样穿

吴君如很早就说过了,陈妍希私下就是这样穿

八卦王者
2026-05-10 13:24:46
李飞飞做AI游戏,拿了4个亿

李飞飞做AI游戏,拿了4个亿

量子位
2026-05-06 13:39:39
王心凌现场脑子转得飞快,面对有人起哄让她脱衣

王心凌现场脑子转得飞快,面对有人起哄让她脱衣

小邵说剧
2026-05-13 00:40:03
出乎意料!特朗普原定访华计划作废,中方官宣,特意增加停留时间

出乎意料!特朗普原定访华计划作废,中方官宣,特意增加停留时间

云舟史策
2026-05-12 07:10:58
赛力斯电池包碰撞场景脱离专利获授权 可在碰撞时使电池包与车体分离

赛力斯电池包碰撞场景脱离专利获授权 可在碰撞时使电池包与车体分离

金融界
2026-05-12 12:09:20
哪一句话让你沉默许久,看网友讲述,我也半天说不出话来,

哪一句话让你沉默许久,看网友讲述,我也半天说不出话来,

侃神评故事
2026-04-02 07:10:03
长期走路能把五类病走没?医生建议:70岁后这样动,降低生病风险

长期走路能把五类病走没?医生建议:70岁后这样动,降低生病风险

39健康网
2026-05-11 18:31:48
四川家长怒了:学校别再办成人礼了,太恶心人了

四川家长怒了:学校别再办成人礼了,太恶心人了

复转这些年
2026-05-11 16:28:54
广东出局揪最大罪人!开场3分钟2犯+全场0分,亲手拒掉200万奖金

广东出局揪最大罪人!开场3分钟2犯+全场0分,亲手拒掉200万奖金

弄月公子
2026-05-12 22:19:29
哲学家启示:困在底层的人急于表达观点,爬到腰部的人选择闭口不言,而真正到顶的人,执着的是这两件事

哲学家启示:困在底层的人急于表达观点,爬到腰部的人选择闭口不言,而真正到顶的人,执着的是这两件事

心理观察局
2026-05-12 09:49:04
女子因18元奶茶被亲姐拉黑,崩溃大哭:离婚带娃5年,都看不起我

女子因18元奶茶被亲姐拉黑,崩溃大哭:离婚带娃5年,都看不起我

辣媒专栏记录
2026-05-11 08:21:59
2026-05-13 02:39:00
码农翻身 incentive-icons
码农翻身
有趣且硬核的技术文章
261文章数 652关注度
往期回顾 全部

科技要闻

宇树发布载人变形机甲,定价390万元起

头条要闻

特朗普称将同中方讨论对台军售和黎智英案 外交部回应

头条要闻

特朗普称将同中方讨论对台军售和黎智英案 外交部回应

体育要闻

骑士终于玩明白了?

娱乐要闻

白鹿风波升级!掉粉20万评论区沦陷

财经要闻

利润再腰斩 京东干外卖后就没过过好日子

汽车要闻

吉利银河“TT”申报图曝光 电动尾翼+激光雷达

态度原创

亲子
手机
房产
旅游
军事航空

亲子要闻

有点东西。周宁运动空间

手机要闻

传iPhone 18 Pro或在内存危机中将继续维持“激进定价”策略

房产要闻

穗八条引爆楼市!万博宝藏红盘,五一劲销出圈

旅游要闻

故宫挤满游客,人人撑伞前行:宁愿热到出汗,也要奔赴紫禁城!

军事要闻

知情人士披露:美国或考虑恢复对伊朗军事行动

无障碍浏览 进入关怀版