【Rust】——函数(所有权)以及借用或引用

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

​​​​​​🥽Linux:​​​​Linux_Y小夜的博客-CSDN博客

🚝Rust:Rust_Y小夜的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯函数与所有权

 🎯返回值与所有权

🎯借用与引用

悬垂引用:


🎯函数与所有权

        将值传递给函数与给变量赋值的原理相似。向函数传递值可能会移动或者复制,就像赋值语句一样。

fn main() {let s = String::from("hello");  // s 进入作用域takes_ownership(s);             // s 的值移动到函数里 ...// ... 所以到这里不再有效let x = 5;                      // x 进入作用域makes_copy(x);                  // x 应该移动函数里,// 但 i32 是 Copy 的,// 所以在后面可继续使用 x} // 这里,x 先移出了作用域,然后是 s。但因为 s 的值已被移走,// 没有特殊之处fn takes_ownership(some_string: String) { // some_string 进入作用域println!("{}", some_string);
} // 这里,some_string 移出作用域并调用 `drop` 方法。// 占用的内存被释放fn makes_copy(some_integer: i32) { // some_integer 进入作用域println!("{}", some_integer);
} // 这里,some_integer 移出作用域。没有特殊之处

 🎯返回值与所有权

fn main() {let s1 = gives_ownership();         // gives_ownership 将返回值// 转移给 s1let s2 = String::from("hello");     // s2 进入作用域let s3 = takes_and_gives_back(s2);  // s2 被移动到// takes_and_gives_back 中,// 它也将返回值移给 s3
} // 这里,s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走,// 所以什么也不会发生。s1 离开作用域并被丢弃fn gives_ownership() -> String {             // gives_ownership 会将// 返回值移动给// 调用它的函数let some_string = String::from("yours"); // some_string 进入作用域。some_string                              // 返回 some_string // 并移出给调用的函数// 
}// takes_and_gives_back 将传入字符串并返回该值
fn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域// a_string  // 返回 a_string 并移出给调用的函数
}

        变量的所有权总是遵循相同的模式:

  • 将值赋给另一个变量时移动它。
  • 当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。

🎯借用与引用

fn main() {let s1 = String::from("hello");let len = calculate_length(&s1);println!("The length of '{}' is {}.", s1, len);
}fn calculate_length(s: &String) -> usize {s.len()
}

        注意变量声明和函数返回值中的所有元组代码都消失了。其次,注意我们传递 &s1 给 calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是 引用,它们允许你使用值但不获取其所有权

        补充:注意:与使用 & 引用相反的操作是 解引用dereferencing),它使用解引用运算符,*

        我们将创建一个引用的行为称为 借用borrowing)。

        正如变量默认是不可变的,引用也一样。(默认)不允许修改引用的值。

可变引用:

fn main() {let mut s = String::from("hello");change(&mut s);
}fn change(some_string: &mut String) {some_string.push_str(", world");
}

        提醒:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。

        数据竞争data race)类似于竞态条件,它可由这三个行为造成:

  • 两个或更多指针同时访问同一数据。
  • 至少有一个指针被用来写入数据。
  • 没有同步数据访问的机制。

        我们也不能在拥有不可变引用的同时拥有可变引用:

        不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!然而,多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。

悬垂引用:

        在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针dangling pointer)。

        在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman相关问题及答案(2024)

1、Postman 是什么?它的用途是什么? Postman 是一个流行的 API (应用程序编程接口) 开发辅助工具,它帮助开发者设计、测试、文档化和监控 APIs。Postman 提供了一个友好的用户界面,使得发送网络请求、检查响应和其他与 API 交互的…

RK3568开发笔记-sdmmc3.0 error -110 whilst initialising SD card问题解决

目录 前言 一、SD介绍 二、原理图连接 三、设备树配置 四、SD卡调试

不是詹姆斯了?皮蓬改口称乔丹是他的GOAT

NBA直播吧-nba直播在线观看免费高清直播录像回放NBA直播吧是一个专业NBA直播在线观看免费直播平台,专业提供nba直播免费高清在线观看中文jrs无插件直播,NBA录像回放,CBA直播,WNBA以及篮球直播,足球直播五大联赛等最新直…

同步与异步:程序执行方式的不同之处

在软件开发中,同步和异步是两个重要的概念,用于描述程序的执行方式。它们的区别在于程序在处理任务时是否需要等待或阻塞。下面我们来详细了解一下它们的区别和应用场景。 同步(Synchronous) 同步操作是指程序按照顺序执行&…

CNN中的伯努利分布与二项式分布

文章目录 一、伯努利分布是什么?1、伯努利分布的应用2、伯努利分布在CNN中的应用3、举个栗子4、伯努利分布可以用于多个类别的分类么5、伯努利分布与多项式分布的区别与联系 二、多项式分布是什么?1、多项式分布在CNN中的应用2、举个栗子 三、损失函数是…

蓝桥杯-常用STL(三)

常用STL 🎈1.映射🎈2.map的基础使用🔭2.1引入库🔭2.2构造一个映射🔭2.3插入一对映射🔭2.4判断关键字是否存在🔭2.5遍历映射🔭2.6清空 🎈1.映射 🔎映射是指两个…

Pycharm环境中,python为变量赋值的时候,如何自动添加空格?

在python中,为变量赋值的时候,如果没有加入空格,代码底部会有灰色波浪线,说明不符合Python规范。 可以在菜单栏选择code,reformat code。重新格式化代码,所有代码会自动格式化。 快捷方式为:ct…

Marble Race in Algodoo

Marble 的形式 ENCNMarble Race小球竞赛 / 球球比赛Marble Elimination小球淘汰赛Survival Proliferation生存繁殖赛Territory War领土战争Castle Destruction城堡破坏 / 城堡毁灭Sea Battle / Ship Battle海战 / 战船较量Escape from ( )跑路比赛 / 从( )逃离 Thyme 中的符号…

数据库JSON类型到映射JAVA上

Mysql存放JSON数据如何映射JAVA实体类 概述:最近写在写SKU模块中,需要表中字段存放JSON类型数据,mybatis-plus在查询的时候如何跟JSON类型所匹配呢?再次记录一下。 直接上代码,后面有解释到底如何映射上的。 Mysql表…

UV-K5

该方法是安装到python的安装目录了,建立项目的时候勾选 Inherit globel site-packages (使用全局的站点包) ,就能调用安装路径的包文件环境。 cmd进入Dos窗口安装 pyserial 模块: pip install pyserial

阿里巴巴中国站获得公司档案信息 API 返回值说明

一、应用场景 阿里巴巴中国站获得公司档案信息 API接口的应用场景可以包括但不限于以下几种情况: 1、企业信息查询:API接口可用于查询企业的基本档案信息,如企业名称、注册地址、法定代表人、经营范围等。这些信息对于了解企业背景、信用状…

学习枚举

枚举 引入 编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter) 概念 枚举(enum)全称为 enumeration, 是 JDK 1.5 中引入的新特性…

Find Yourself

前言 2月份,真是发生了很多事情啊。 离职,放假,瞒着家人,过春节,陪女儿玩游戏,找工作,选择Offer。 也和别人一起解决了一个设备不稳定的重大问题。 每一项展开讲讲都能写一篇文章。 如果你感…

手机和windows的便签怎么共享账号使用

在忙碌的生活中,我经常需要在手机和电脑之间同步记事信息。可是,每次当我在手机上记下一些重要事项后,想要在电脑上查看或继续编辑时,总是遇到各种麻烦。因为手机和电脑上的便签软件各不相同,无法实现账号共享和内容同…

从0到1实现五子棋游戏!!

Hello,好久不见宝子们,今天来给大家更一个五子棋的程序~ 我们今天要讲的内容如下: 文章目录 1.五子棋游戏介绍1.1 游戏玩法介绍: 2.准备工作2.1 具体操作流程 3.游戏程序主函数4.初始化棋盘4.1.定义宏变量4.2 初始化棋盘 5.打印…

2024年2月最新微信域名检测拦截接口源码

这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList,然后遍历该数组,对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下: 1. 定义待检测的域名列表。 2. 遍历域名…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

rust连接postgresql数据库

同步操作 引入crate&#xff1a; postgres "0.19.7" use postgres::{Client, NoTls, error::Error};fn main() -> Result<(), Error> {let mut client Client::connect("hostlocalhost port5432 dbnamexxxxxdb userpostgres password123456"…

优化全球应用交付,详解GLSB是什么?

伴随着互联网的快速发展&#xff0c;网站的流量请求甚至能达到上千亿&#xff0c;越来越多的用户不满足于在单一数据中心提供服务&#xff0c;开始考虑容灾、用户就近访问以及全球应用交付等问题。在这样的需求下&#xff0c;全局服务器负载均衡技术&#xff08;GSLB&#xff0…

Linux笔记--基本操作指令

一、查看日期与日历 1.date指令 显示日期 #用法1:dateCST: China Standard Time时区&#xff0c;中国标准时间 #用法2: date 指定格式 [常用格式]: "%Y-%m-%d"(%F): 2022-07-25 "%H:%M:%S"(%T): 14:53:44 "%F %T" #用法3: date -d "-1 da…