rust所有权
所有权与函数
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所有权的更多相关文章
- Rust所有权语义模型
编程语言的内存管理,大概可以分为自动和手动两种. 自动管理就是用 GC(垃圾回收)来自动管理内存,像 Java.Ruby.Golang.Elixir 等语言都依赖于 GC.而 C/C++ 却是依赖于手 ...
- Rust所有权及引用
Rust 所有权和借用 Rust之所以可以成为万众瞩目的语言, 就是因为其内存安全性. 在以往内存安全几乎全都是通过GC的方式实现, 但是GC会引来性能.CPU以及Stop The World等问题, ...
- 对Rust所有权、借用及生命周期的理解
Rust的内存管理中涉及所有权.借用与生命周期这三个概念,下面是个人的一点粗浅理解. 一.从内存安全的角度理解Rust中的所有权.借用.生命周期 要理解这三个概念,你首要想的是这么做的出发点是什么-- ...
- Rust <4>:所有权、借用、切片
tips:栈内存分配大小固定,访问时不需要额外的寻址动作,故其速度快于堆内存分配与访问. rust 所有权规则: 每一个值在任意时刻都有且只有唯一一个所有者 当所有者离开作用域时,这个值将被丢弃 所有 ...
- 最强肉坦:RUST多线程
Rust最近非常火,作为coder要早学早享受.本篇作为该博客第一篇学习Rust语言的文章,将通过一个在其他语言都比较常见的例子作为线索,引出Rust的一些重要理念或者说特性.这些特性都是令人心驰神往 ...
- Rust之路(4)——所有权
[未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...
- Rust中的所有权,引用和借用
这个有意思,指针解释获新生!!! fn main() { let mut s = String::from("hello"); s.push_str(", world!& ...
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
- Rust: move和borrow
感觉Rust官方的学习文档里关于ownship,borrow和lifetime介绍的太简略了,无法真正理解这些语法设计的原因以及如何使用(特别是lifetime).所以找了一些相关的blog来看,总结 ...
随机推荐
- HTML实用文本框样式
输入框景背景透明: <input style="background:transparent;border:1px solid #ffffff"> 鼠标划过输入框,输入 ...
- Django:信号的使用
信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 应用:比如插入数据到数据库,插入之前写日 ...
- Android为TV端助力之点击Textview无效
记录一下如果有两个Textview都有点击事件,那么不能给Textview同时设置 android:focusable="true"android:focusableInTouch ...
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...
- QuickStart系列:Docker部署PostgreSQL
docker镜像地址: https://hub.docker.com/_/postgres/ https://www.widuu.com/chinese_docker/examples/postgre ...
- H3C 40MHz频宽模式
- javascript数据结构与算法——栈
前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...
- Python +appium baseview
封装python+appium 的baseview模块 from selenium.webdriver.support.ui import WebDriverWait from time import ...
- python笔记39-unittest框架如何将上个接口的返回结果给下个接口适用(面试必问)
前言 面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果,给用例b使用. unittest框架的每个用例都是独立的,测试数据共享的话,需设 ...
- JS关闭当前窗口
function logOut() { $('#logging-out').on('click', function () { stopPreventDefault(); $.messager.con ...