RUST语言之引用与借用

server/2024/12/22 0:44:37/

1.通过参数形式使用引用

调用函数并传入引用 

rust"> //String::from会分配内存来存储RUST语言参考与借用//然后将s指针指向这块内存地址let mut s=String::from("RUST语言参考与借用");println!("{}",s);//调用自定义函数并传入引用let x= reftest(&mut s);//取返回值,传入时要添加mutprintln!("==={}===",x);//输出

函数声明:

rust">//函数名: reftest
//参数: s 参数类型: String &:表示是一个引用
//->:表示函数有返回
//usize:表示函数返回类型
fn reftest(s:&mut String)->usize{//引用不拥有内存所有权,只能读取,不能修改内存数据// ^ `s` is a `&` reference,// so the data it refers to cannot be borrowed as mutable//s.push_str("okok");//如果要修改,传入的引用必须是可变引用//增加mut关键字,使用引用内存可修改s.push_str("===>HelloWorld!");println!("修改后的字符串:   {}",s);return  s.len()
}

2.可变量多次引用

rust">//一个可变量,同时最多只能被引用一次let ref1 =&mut s;//报: ^^^^^^ second mutable borrow occurs here//同一作用域内会造成数据竞争//let ref2=&mut s;println!("作用域1==={}",ref1);//使用作用域名隔离,要解决上面问题{let ref2 = &mut s;println!("作用域2==={}",ref2);//测试, ^^^^^^ second mutable borrow occurs here//不可同时调用//println!("{},{}",ref1,ref2);}

3.不可变量多次引用

rust">//可变引用可多次被不可变引用指向let ref3=&s;//强制转换let ref4=&s;//强制转换println!("=={},{}",ref3,ref4);let ref5 = &mut s;println!("{}",ref5);//同时使用// ^^^^^^ mutable borrow occurs here//因为此时 ref3与ref4在使用这块内存,不可同时被ref5访问//println!("=={},{},{}===",ref3,ref4,ref5);println!(">>>{}",return_inner_str());

4. 悬空引用演示

rust">//悬空引用演示,不可返回内部变量的引用
// expected named lifetime parameter
/*fn return_inner_ref() -> &String{let s =String::from("Hello");return &s;
}*/fn return_inner_str() -> String{let s = String::from("Hello");// s //不加return 不用加;return s;
}

5.完整示例代码:

rust">fn main() {//String::from会分配内存来存储RUST语言参考与借用//然后将s指针指向这块内存地址let mut s=String::from("RUST语言参考与借用");println!("{}",s);//调用自定义函数并传入引用let x= reftest(&mut s);//取返回值,传入时要添加mutprintln!("==={}===",x);//输出//一个可变量,同时最多只能被引用一次let ref1 =&mut s;//报: ^^^^^^ second mutable borrow occurs here//同一作用域内会造成数据竞争//let ref2=&mut s;println!("作用域1==={}",ref1);//使用作用域名隔离,要解决上面问题{let ref2 = &mut s;println!("作用域2==={}",ref2);//测试, ^^^^^^ second mutable borrow occurs here//不可同时调用//println!("{},{}",ref1,ref2);}//可变引用可多次被不可变引用指向let ref3=&s;//强制转换let ref4=&s;//强制转换println!("=={},{}",ref3,ref4);let ref5 = &mut s;println!("{}",ref5);//同时使用// ^^^^^^ mutable borrow occurs here//因为此时 ref3与ref4在使用这块内存,不可同时被ref5访问//println!("=={},{},{}===",ref3,ref4,ref5);println!(">>>{}",return_inner_str());}//函数名: reftest
//参数: s 参数类型: String &:表示是一个引用
//->:表示函数有返回
//usize:表示函数返回类型
fn reftest(s:&mut String)->usize{//引用不拥有内存所有权,只能读取,不能修改内存数据// ^ `s` is a `&` reference,// so the data it refers to cannot be borrowed as mutable//s.push_str("okok");//如果要修改,传入的引用必须是可变引用//增加mut关键字,使用引用内存可修改s.push_str("===>HelloWorld!");println!("修改后的字符串:   {}",s);return  s.len()
}//悬空引用演示,不可返回内部变量的引用
// expected named lifetime parameter
/*fn return_inner_ref() -> &String{let s =String::from("Hello");return &s;
}*/fn return_inner_str() -> String{let s = String::from("Hello");// s //不加return 不用加;return s;
}


http://www.ppmy.cn/server/1700.html

相关文章

pnpm 报错: ERR_PNPM_META_FETCH_FAIL

今天突然遇到一个报错,pnpm 报错: ERR_PNPM_META_FETCH_FAIL  GET https://registry.npm.taobao.org/vue%2Fcli-service: request to https://registry.npm.taobao.org/vue%2Fcli-service failed, reason: certificate has expired问题原因:…

爬虫 | 垃圾处理设施数据的获取与保存

Hi,大家好,我是半亩花海。本项目通过发送网络请求(requests),从指定的 URL 获取垃圾处理设施的相关数据,并将数据保存到 CSV 文件中,以供后续分析和利用。 目录 一、项目结构 二、详细说明 三…

【Linux】进程的优先级环境变量

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 进程的优先级2.1 什么是优先级2.2 为什么要有优先级2.3 优先级的查看方式2.4 对优先级调整 3. 命令行参数4. 环境变量4.1 环境变量与配置文件4.1.1 环境变量初步介绍4.1.2 配置文件 4.2 更多环境变量4.3 整…

C++力扣Leetcode算法4--排序算法

目录 快速排序--递归 归并排序--递归 插入排序 冒泡排序 选择排序 215 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 347. 前 K 个高频元素 快速排序--递归 void quick_sort(vector<int> &nums, int l, int r) {if (l 1 > r) …

代码随想录图论

1. 所有可能的路径 class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:def dfs(graph, result, path, root): #result 返回结果, path记录路径, root记录遍历到了第几个节点if root len(graph) - 1: #如果遍历到最后…

.NET Framework安装失败的原因及解决方法

.NET Framework安装失败的原因及解决方法 大家好我是艾西&#xff0c;一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NET Framework缺失的提示&#xff0c;那么也会有很多的小伙伴搞不懂什么原因导致的&#xff0c;这个问…

【YUNBEE云贝-进阶课】MySQL8.0性能优化实战培训

众多已经学习过MySQL 8.0 OCP认证专家的课程的同学们对 MySQL 8.0 的安装部署、体系结构、配置监控、用户管理、主从复制、系统运维、MGR等基础操作和动手实验有了一定的学习基础.很多学员反馈希望更进一步提升技术能力、解决工作中碰到的性能问题。 针对MySQL8.0的数据库性能优…

C语言中的控制语句(分支语句 if、switch、三目运算符)

程序执行的三大流程 顺序 : 从上向下&#xff0c; 顺序执行代码分支 : 根据条件判断&#xff0c; 决定执行代码的分支循环 : 让特定代码重复的执行 分支语句 条件语句用来根据不同的条件来执行不同的语句&#xff0c;C语言中常用的条件语句包括if语句和switch语句。 if 语句…