Rust学习-阶段1学习总结

  学习Rust已经两周了,基本上是断断续续的在学,或者是在上下班坐公交时,或者是在ODC没事做时。现在已经学习了Rust程序设计语言的前5章,是时候做一个总结了。关于数据类型或者if else这种内容我就不在罗列了,我只说一说我感兴趣的部分。

  • 变量和可变性(variable & mutability)
  • 函数的隐式返回值
  • 理解语句(statement)和表达式(expression)的区别
  • break可以带变量
  • 元组
  • 所有权(ownership)

 其中所有权我会重点说一下。

先看看Rust官网的slogan,slogan往往是可以有一个更加整体的理解。

 

  我抽取下Key words,1. 每个人  2. 可靠且高效。“每个人”说明这门语言不会像面向machine的汇编或者C,应该具备现代语言的一些特性,泛型,反射,完善的函数库,好用的集合等等。可靠且高效,“可靠”就是说写出来的程序的漏洞会少,不会像C那样不检查下标越界,也不会产生一些常见的内存错误(doule free或者悬挂指针之类的)。当说到“高效”我想到了C++,大家都说C++的编译时间长且开发很慢(c++我没什么发言权,说的不对,诸君还请谅解),既然是高效,我想就不能仅仅是运行时间快了吧,开发时间也应该快。下面我们探讨一下我上面说的几点。

  

1. 变量和可变性

  rust中变量默认是不可变的,也就是说下面的类似下面的赋值操作是非法的。

fn main() {
    let a = 100;
    a = 101;
}

  会出现这样的错误,“不能给一个不可变的变量赋值两次。”

  如果你需要一个“会变”的变量,那你需要用 mut 关键字去显式(explicitly)的声明一个变量。这么设计的原因,为什么我们需要显示的去声明一个变量为可变的?我也不知道,我猜测跟所有权有关?

fn main() {
    let mut a = 100;
    a = 101;
}

2.  函数的隐式返回值

      如果函数不适用return语句进行返回的话,函数隐式的返回最后一个表达式。当然这种写法是可以选装的,你可以选择传统的return版的返回语句。

fn add_one(num: i32)->i32 {
    num+1
}

fn main() {
    let mut a = 100;
    a = 101;
    println!("{}", add_one(a));
}

3. 理解语句(statement)和表达式(expression)的区别

  rust对于语句和表达式的区分比较严格,语句就是执行一些操作但并不产生结果的指令,表达式计算并产生一些值。

let mut num = 100;  //一个赋值语句
num = num + 1;  //语句
num + 1   //表达式

   函数调用是一个表达式。宏调用是一个表达式。我们用来创建新作用域的大括号(代码块),{},也是一个表达式。

let y = {
    let x = 3;
    x+1
};

4.  break可以带变量

  就下边那样,loop是rust中的循环,类似while(1)。  

fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter*2;
        }
    };
    println!("The Result is {}", result);
}

5.  元组

  元组(tuple)类型是一个复合类型,它可以包含多种不同类型。这种类型的形式是 " (type1, type2, type3 ... ... ) "。

let tuple1 = (1, "hello", 3.14);
let tuple2: (i32, string, f32) = (1, "hello", 3.14);

  那么怎么去获取元组的元素呢。可以通过元组的解构(destructuring),通过解构元组我们可以把元组内的值赋给其他的变量。

let (x, y, z) = tuple1;

  也可以使用点号(".")去直接访问元组内的元素

let x = tuple1.0;
let y = tuple1.1;
let z = tuple1.2;

6.  所有权(ownership)

  所有权是rust一个特点之一,也是rust内存管理的核心。每个值(可以理解是内存的一小块)都有一个所有者,这个所有者可以是变量。同时程序超出所有者的作用域时,所有者所有的值也会通过调用drop()函数,从而被释放。(注意drop不是通过运行时来调用的,而是在编译期就被插入了drop函数),这种做法类似于C++中的RAII机制。值得注意的是,所有权是可以被转移的,并且所有者在转移了值的所有权之后,他就会被rust认为是无效的所有者,再次使用该变量(所有者)会产生错误。

fn foo(str_cp:String) {
    println!("{}", str_cp);
}

fn main() {
    let str1 = String::from("hello world");
    foo(str1);
    println!("{}", str1);
}

  在上边的例子中,我们在堆上创建了一个字符串"hello world",该字符串的所有者是变量str1,值得注意的是,将变量作为函数的形参也会转移值的所有权,因此我们当7行的函数调用返回时,str1已经是一个无效的所有者,可怜的str1,白白丢了自己的地盘,但是他也不是什么都没有收获的,这种所有权的转移,也是有好处的。

  这里我生搬硬套了一种情况,尝试说明这种所有权转移的机制是如何防止double free的情况产生的。下面是一段和上述代码段类似的代码段,可以看到这里对同一内存块进行了两次free。那么rust是如何防止这种情况产生的呢?实际上在rust中17行的情况根本就不会出现,因为str1在此时已经是无效的了,没有free它的可能性。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void foo(char *str)
{
    printf("%s\n", str);
    free(str);
}

int main(void)
{
    while (1) {
        char *str1 = (char *)malloc(512);
        strncpy(str1, "hello world", 512);
        foo(str1);
        free(str1);  //double free
        printf("%s\n", str);
    }
    return 0;
}

  就这样,本文只是我对前几天的学习进行的一个简单的总结。很多重要的东西都没有覆盖,等我的rust用的更熟练,我会尝试出一个Rust教程。Peace。

参考  

[1] https://kaisery.github.io/trpl-zh-cn/ch04-02-references-and-borrowing.html

[2] https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html

原文地址:https://www.cnblogs.com/dennis-wong/p/12081543.html

时间: 2024-10-04 04:03:14

Rust学习-阶段1学习总结的相关文章

告别C#,进入了下一个阶段的学习啦

嘿嘿,今天我们结束了C#的基础的学习,开始啦第二个阶段的学习,就是对SQL Server的学习.今天又是一个周一,又是一个新的开始,感觉我们都是一周一周的计算,而不是每天到这个点就是告别了今天的生活啦吧,所以新的一周,新的开始,新的心情,新的学习,新的收获.下面就总结下我们今天学习的有关的SQL Server,嘿嘿. 一.进入环境的过程 当我们安装好数据库系统的环境后,可以给自己创建一个快捷方式啦,嘿嘿,我们使用的都是2008版本的啦,双击打开数据库系统的快捷方式之后,过程如下.    在上面图

百度前端技术学院第一学习阶段总结

第一学习阶段已经结束了,针对HTML/CSS的训练,收获很多,现在对于CSS开始熟练,也享受一个漂亮的网页在手下诞生的满足感.今天再回过头去看看排行榜第一的各组的代码,继续学习. 任务一:使用了一些知道但很少用到的标签(可能也是因为以前练得太少了) 1.<figure>标签运用在在文档中插入图片,文档的内容与图片有关,是html5的新标签.使用<figcaption>元素为figure添加标题: 2.选择框<form><label>性别:</label

[liusy.api-SMJ]-创建工程范例 MAVEN archetype 学习阶段(一)

由于这个架构需要好多不同能力的工程,为了创建方便减少冗余,创建工程范例尤为重要 学习阶段: 参考资料 http://maven.apache.org/archetype/maven-archetype-plugin/advanced-usage.html 1.将service maven工程作为基础代码 进入工程目录执行 mvn archetype:create-from-project 如果运行出错试试在POM中加入 <plugin>                <groupId&g

大学阶段如何学习

科学与技术 知识架构 大学阶段如何学习 1st 基础.术语.知识[思维] 数理思维 [思维与系统] 计算思维 →高度决定视野 (设计,机械产品中的自动控制系统,改变生活) (程序设计,计算思维.理解程序变成机器,程序执行程序环境,求解的计算思维)「机器」 →角度改变观念 (沉迷于事业不能自拔) (思维有用还是技术有用,软件体现的计算思维) →尺度把握人生 (不断学习,训练,提高.量变到质变) 为什么学,怎样学,学什么 为什么学 ? STEM job supply versus demand jo

Jsp+Servlet+JavaBean学习阶段案例-留言板(MessageBoard)

Jsp+Servlet+JavaBean学习阶段的一个案例总结 名称:留言板(MessageBoard) 开发技术:Jsp+Servlet+JavaBean 数据库:Mysql 开发工具:IntelliJ IDEA 2016.1.3 服务器:Tomcat 8.0.36 功能说明 普通用户:增加删除修改留言信息 管理员:增加删除修改留言信息.管理用户.设置用户发帖留言权限 数据库结构 tb_user表 字段 类型 名称 说明 id int id name nvarchar 姓名 password

[ios学习]零基础学习iOS开发如何分配时间

在培训期间,学生的时间应该如何分配 学生在学习期间的主要工作时间分配 9:00~ 9:30,认真听同学的学习阶段中的分享,俗话说的好"三人行,必有我师"; 9:30~ 18:00,认真听老师的课堂上课,并且要准备好一个手写笔记本,好记性不如烂笔头,当然我个人认为记录在电脑上,并不靠谱,而且在复习时还费眼,我从开始上学到现在就一直有在笔记本上写写画画的习惯; 19:00~ 20:00,用一个小时的时间,回忆今天上课的知识点,这时笔记本的重要性就体现了,它可以帮助我们心无旁骛的复习和总结;

新手如何学习java(java学习建议路线图)

怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:     首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME.J2ME,The Micro Edition of the Java 2 Platform.主要用于嵌入

新人学习之接口测试学习

  <后台搜索服务>接口学习书 适用范围  XX软件-大客户业务中心  作者  段旭    一.项目概述 1.项目简介: (1)内容: 此文是介绍接口测试是怎样进行的,结合后台搜索服务,从理论引申到实践的一个学习过程,其中包括介绍阶段性的学习与实践,内容并不具体详细,很多细节还是需要自己进行学习和探究,知识与经验是靠累积与沉淀才稳固牢靠. (2)背景: XX开发适配各种http接口给需要服务的CP提供相应的支持. (3)意义: 议读此计划书,一共有3重意义: 第一,学习测试,认识软件测试过程,

好程序员大数据学习路线Hadoop学习干货分享

好程序员大数据学习路线Hadoop学习干货分享,Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件.Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据).包括这些模块: Hadoop Common:支持其他Hadoop模块的常用工具. Hadoop分布式文件系统(HDFS?):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问. Hadoop YARN:作业调度和集群资源管理的框架. Hadoop MapRedu