所有权与函数

fn main() {
let s = String::from("hello");
takes_ownership(s); //s的值移动到函数里 let x = 5; //x进入作用域
makes_copy(x); //x应该移动到函数里,但是i32是copy,所以后面可以继续使用x。 println!("x is {}",x);
//下面这句编译会出错, ^ value borrowed here after move
//println!("s is {}",s); } fn takes_ownership(some_string:String){ println!("{}",some_string);
} //some_string离开作用域并调用drop方法。占用的内存释放 fn makes_copy(some_integer: i32) {
println!("{}",some_integer);
}

返回值与作用域

fn main() {
let s1 = gives_ownership(); //函数返回值some_string移动给s1
let s2 = String::from("hello"); //s2进入作用域
let s3 = take_and_give_back(s2); //s2移动但函数,然后移交给s3。最终只有s3有效 } fn gives_ownership() -> String {
let some_string = String::from("hello");
some_string //因为some_string是String类型,所以这里做移动操作
} fn take_and_give_back(a_string: String) -> String {
a_string
}

引用的使用

//为了能够返回函数的值以及其值的一些属性,我们可以使用引用
//类似go的指针吧,只获取值不获取所有权。
fn main() {
//因为默认不允许修改引用的值,所以加mut。
let mut s = String::from("hello world"); //let s1 = &mut s;
//但是要注意:在特定作用域中的特定数据有且只有一个可变引用。
//s1已经引用了,s2就不能再用,避免了数据竞争 //let s2 = &mut s; // println!("{}", s1);
//可以使用大括号来创建一个新的作用域,s1和s2的作用域不同。
{
let s1 = &mut s;
println!("s1 {}", s1);
}
let s2 = &mut s;
println!("s2{}", s2); // change(&mut s); } // fn change(some_string: &mut String){
// some_string.push_str(",world");
// }

注意:同一个区域不允许可变和不可变引用同时存在例如下面这样

let mut s = String::from("hello world");
let s1=&s;
let s2=&s;
//println("{},{}",s1,s2); //s1,s2调用之后失效,下面的可变引用s3才能生效。
let s3=&mut s;

rust所有权的更多相关文章

  1. Rust所有权语义模型

    编程语言的内存管理,大概可以分为自动和手动两种. 自动管理就是用 GC(垃圾回收)来自动管理内存,像 Java.Ruby.Golang.Elixir 等语言都依赖于 GC.而 C/C++ 却是依赖于手 ...

  2. Rust所有权及引用

    Rust 所有权和借用 Rust之所以可以成为万众瞩目的语言, 就是因为其内存安全性. 在以往内存安全几乎全都是通过GC的方式实现, 但是GC会引来性能.CPU以及Stop The World等问题, ...

  3. 对Rust所有权、借用及生命周期的理解

    Rust的内存管理中涉及所有权.借用与生命周期这三个概念,下面是个人的一点粗浅理解. 一.从内存安全的角度理解Rust中的所有权.借用.生命周期 要理解这三个概念,你首要想的是这么做的出发点是什么-- ...

  4. Rust <4>:所有权、借用、切片

    tips:栈内存分配大小固定,访问时不需要额外的寻址动作,故其速度快于堆内存分配与访问. rust 所有权规则: 每一个值在任意时刻都有且只有唯一一个所有者 当所有者离开作用域时,这个值将被丢弃 所有 ...

  5. 最强肉坦:RUST多线程

    Rust最近非常火,作为coder要早学早享受.本篇作为该博客第一篇学习Rust语言的文章,将通过一个在其他语言都比较常见的例子作为线索,引出Rust的一些重要理念或者说特性.这些特性都是令人心驰神往 ...

  6. Rust之路(4)——所有权

    [未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...

  7. Rust中的所有权,引用和借用

    这个有意思,指针解释获新生!!! fn main() { let mut s = String::from("hello"); s.push_str(", world!& ...

  8. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  9. Rust: move和borrow

    感觉Rust官方的学习文档里关于ownship,borrow和lifetime介绍的太简略了,无法真正理解这些语法设计的原因以及如何使用(特别是lifetime).所以找了一些相关的blog来看,总结 ...

随机推荐

  1. wamp环境下配置https证书后,网站内容访问受限

    wamp环境下配置https证书后,网站内容访问受限,点击首页链接标签后报错,大致意思是没有权限进行操作. 解决方法:打开apache的http.conf(位置大致如下:项目所在目录\bin\apac ...

  2. 常见数据结构的 Python 实现(建议收藏)

    数据结构作为计算机基础的必修内容,也是很多大型互联网企业面试的必考题.可想而知,它在计算机领域的重要性. 然而很多计算机专业的同学,都仅仅是了解数据结构的相关理论,却无法用代码实现各种数据结构. 今日 ...

  3. shell编程之99乘法表

    #99乘法表#!/bin/bash #第一种写法 ` #`seq ` 使用反撇号括起来的(不是单引号),表示命令替换 do for j in `seq $i` #seq可以使用变量 do echo - ...

  4. 实验之RSTP基础配置

    STP升级版之RSTP 实验环境 实验拓扑图 实验编址 实验步骤 1.基本配置配置PC端 测试i相通性 2.配置RSTP基本功能在S1-S4上都使用命令stp mode rstp更改生成树模式(因为华 ...

  5. NGINX状态模块的使用

    nginx状态模块可以用来查看当前nginx服务器的并发量和总的请求数 启用nginx的状态模块 状态模块需要在编译安装的时候启用. 1.下载nginx源码包 2.安装nginx并启用模块 3.修改n ...

  6. 【学英语~磨耳朵】2013年以来看过的所有美剧&电影&纪录片等等

    我看美剧看太多了,而且同一部剧刷很多遍.这种coach potato的做法其实一点也不好,英文会好可能只是意外收获.下面是单子: 美剧: 老友记-情景喜剧-10季全看.至今还在网易云音乐循环10季音频 ...

  7. Linux的rwx

  8. 使用python的jira库操作jira的版本单和问题单链接

    操作JIRA的API来实现的. 但感觉比单纯操作API要简单一些. from jira import JIRA from django.conf import settings JIRA_URL = ...

  9. idea 使用在java 包下的ftl、xml 文件编译问题

    问题 使用ftl 时报错出现ftl 文件找不到,后发现idea未编译java 下的ftl文件 解决方法一 手动编译,复制ftl的文件夹在classes下应该在的地方 解决方法二 pom.xml中加入 ...

  10. Git的工作流程

    git的工作流程为: 克隆Git资源作为工作目录 在克隆的资源上添加或者修改文件 如果别人修改了,你可以更新资源 在提交前查看修改 提交修改 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交 ...