? 自从我学了Rust,就开始了受虐之旅,连编译都没成功过!_CQITer_重庆IT人之家 yabo10.com亚博体育,亚博娱乐在线网站,亚博国际娱乐7171 ?

自从我学了Rust,就开始了受虐之旅,连编译都没成功过!

张大胖被别人安利了一个新的语言:Rust,作为编程语言的狂热爱好者,他自然要尝试一番。

自从我学了Rust,就开始了受虐之旅,连编译都没成功过!

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

fn?main()?{?

???println!("hello?world");?

}?

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

fn?main()?{?

????let?v?=?Vec::new();?//创建了一个数组?

????v.push(4);??//?向数组添加一个元素?

}?

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

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

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

编译吧!咦,居然失败了,错误信息是:cannot borrow `v` as mutable, as yabo10.com亚博体育 is not declared as mutable

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

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

所有权

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

fn?main()?{?

????//用另外一种方式创建了一个可变Vector??

????let?mut?v?=?vec![1,2];????

????let?v1?=?v;?

????println!("?the?1st?element?is?{}",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,就开始了受虐之旅,连编译都没成功过!

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

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

fn?main()?{?

????let?mut?v?=?vec![1,2,3,4];?//创建了一个可变Vector?

????print_vector(v);?

????println!("?the?1st?element?is?{}",v[0]);?

?

}?

fn?print_vector(v:?Vec){?

????for?i?in?v?{?

????????println!("{}",?i);?

????}?

}?

编译还是出错!

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

借用

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

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

fn?main()?{?

????let?mut?v?=?vec![1,2,3,4];?//创建一个可变Vector?

????print_vector(&v);?

????println!("?the?1st?element?is?{}",v[0]);?????

}?

fn?print_vector(v:?&Vec){?

??......?

}?

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

fn?print_vector(v:?&Vec)?{?

????v.push(3);?

????.....?

}?

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

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

fn?main()?{?

????let?mut?v?=?vec![1,2,3,4];?//创建了一个Vector?

????print_vector(&mut?v);?

????println!("?the?1st?element?is?{}",v[0]);?????

}?

?

fn?print_vector(v:?&mut?Vec)?{?

????v.push(3);?

????......?

}?

总结一下:

自从我学了Rust,就开始了受虐之旅,连编译都没成功过!

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

fn?main()?{?

????let?mut?x?=?String::from("hello");?

????let?x1?=?&x;?

????let?x2?=?&mut?x;?????

????println!("{}",?x1);?????

}?

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

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

相关推荐
新闻聚焦
猜你喜欢
热门推荐
  • 微软AI面试题有多难?这里有一份样卷

      究竟什么样的AI人才能被微软这样的巨头聘用呢?今天,文摘君就淘来了几道微软AI 面试题,同时给出了最基本的解答......

    06-25????来源:澎湃新闻网

    分享
  • 全球最聪明的大脑怎么看AI?他们预测了

      2017年AI领域取得了诸多成果。2018年AI又将何去何从?以下是来自世界顶级研究人员和行业领军人物对2018年AI领域发展作......

    02-20????来源:虎嗅网

    分享
  • 2017JavaScript框架战报 - React分战场

      我们来看看与React有关的软件包的生态系统。当Facebook构建React时,就有许多来自开源社区的第三方软件包。为提供完......

    02-27????来源:湖北新闻网

    分享
  • 小白学数据:教你用Python实现简单监督学

      监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近......

    03-05????来源:今日头条

    分享
  • 现代编程语言Swift、Kotlin等十大有趣功能

      最近学习了一些现代编程语言,比如Reason,Swift,Kotlin和Dart。这些编程语言提供了许多新功能,本文主要分享了我认......

    04-29????来源:祁东新闻网

    分享
  • 领域场景分析的6W模型

      组成场景的要素常常被称之为6W模型,即描写场景的过程必须包含Who,What,Why,Where,When与hoW这六个要素。......

    04-30????来源:砍柴网

    分享
  • 开源应用服务器WildFly 12发新季度交付模式

      WildFly 12 Final版本现在已经可以下载了,WildFly是一款灵活的开源应用服务器,支持开发人员构建轻量级应用程序。支持......

    05-10????来源:青岛新闻网

    分享
  • 基于Spring Cloud的微服务落地

      微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,......

    06-04????来源:广西新闻网

    分享
  • 为什么阿里工程师纷纷在内网晒代码?

      前阵子,在阿里一个小黑屋里,5名对代码有着极致追求的工程师参与阿里代码领域最高荣誉“多隆奖”的最终角逐。......

    06-08????来源:四川新闻网

    分享
  • 超级大汇总!200多个最好的机器学习、

      我把这篇文章分为了四个部分:机器学习,自然语言处理,python和数学。在每个部分中我都列举了一些主题,但是因......

    09-25????来源:洛阳新闻网

    分享
返回列表
Ctrl+D?将本页面保存为书签,全面了解最新资讯,方便快捷。