热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rust引用和借用

引用是作为参数传递给函数的地址。借用就像我们借一些东西,如果已经完成借用,需要还给原所有者。引用和借用是相互的,即当引用被释放时,借用也结束。为什么要借用?使用借用概念的原因如下:

引用是作为参数传递给函数的地址。借用就像我们借一些东西,如果已经完成借用,需要还给原所有者。 引用和借用是相互的,即当引用被释放时,借用也结束。

为什么要借用?

使用借用概念的原因如下:

  • 借用允许对单个资源进行多次引用,但仍然遵守“单一所有者”。
  • 引用就像C中的指针一样。
  • 引用是一个对象。 引用有两种类型,即可变引用和不可变引用。 在复制不可变引用时移动可变引用。

下面通过一个例子来理解这一点。

fn main()
{
let str=String::from("Yiibai");
let len=calculate_length(&str);
println!("length of the string {}",len);
}
fn calculate_length(s:&String)->usize
{
s.len()
}

执行上面示例代码,得到以下结果 –

length of the string 6

在上面的示例中,calculate_length()函数对字符串str的引用作为参数而不取其所有权。

let str=String::from("Yiibai");
let len=calculate_length(&str);

在上面的场景中,&str是对变量str的引用,但它并不拥有它。 因此,即使引用超出范围,也不会删除引用指向的值。

fn calculate_length(s:&String)->usize
s.len()

在上面的例子中,变量s有效,直到控制没有返回main()函数。 当变量作为函数的引用而不是实际值传递时,不需要返回值到返回所有权。

下面尝试修改借用的值。

fn main()
{
let x=1;
value_changed(&x)
}
fn value_changed(y:&i32)
{
*y=9;
}

以下是上述程序的输出:

《Rust引用和借用》

在上面的示例中,它会引发错误,因为&x是不可变引用。 因此,无法改变y的值。

可变引用

可以通过使用可变引用来修复上述错误。可变引用是那些可以改变的引用。下面通过一个例子来理解这一点。

fn main()
{
let mut x=1;
value_changed(&mut x);
println!("After modifying, the value of x is {}",x);
}
fn value_changed(y:&mut i32)
{
*y=9;
}

执行上面示例代码,得到以下结果 –

After modifying, the value of x is 9

在上面的例子中,创建了一个可变引用,即&mut x,引用由变量y指向,它是&i32类型。 现在,可以更改y变量引用的值。分配9个值,即* y = 9。 因此,x的值也变为9,作为两个变量引用的相同内存位置。

可变引用的限制

只能对特定范围内的一段数据进行一次可变引用。
例如:

let mut str=String::from("Yiibai");
let a= &mut str;
let b= &mut str;

在上面的场景中,编译器抛出一个错误,因为它包含两个在Rust语言中不可能的可变引用。如果程序中存在不可变引用,那么程序中就不能有可变引用。
例如:

let mut str=String::from("Yiibai");
let a= &str;
let b=&str;
let c=&mut str;

在上面的场景中,编译器抛出一个错误,因为当有一个不可变引用时,不能有一个可变引用。


    推荐阅读
    • 如果您是Java开发人员,您会发现Rust相对容易掌握,这要归功于这两种语言的相似性。technology-most-loved-dreaded-and-wantedclass& ... [详细]
    • 3.223.28周学习总结中的贪心作业收获及困惑
      本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
    • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
    • [转载]从零开始学习OpenGL ES之四 – 光效
      继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
    • java线条处理技术_Java使用GUI绘制线条的示例
      在Java的GUI编程中,如何使用GUI绘制线条?以下示例演示了如何使用Graphics2D类的Line2D对象的draw()方法作为参数来绘制一条线。 ... [详细]
    • C++程序员视角下的Rust语言
      自上世纪80年代初问世以来,C就是一门非常重要的系统级编程语言。到目前为止,仍然在很多注重性能、实时性、偏硬件等领域发挥着重要的作用。C和C一样&#x ... [详细]
    • rust编程这篇文章是关于我通过解决Twitch上尚未解决的所有CtCI问题来学习Rust的经验。英国科学博物馆集团AdaLovelace的肖像Rust徽标,由Moz ... [详细]
    • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
    • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
    • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
      本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
    • Java容器中的compareto方法排序原理解析
      本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
    • C# 7.0 新特性:基于Tuple的“多”返回值方法
      本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
    • JVM 学习总结(三)——对象存活判定算法的两种实现
      本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
    • Ubuntu 用户安装 Linux Kernel 3.15 RC1
      nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
    • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
    author-avatar
    博文_Andrew-属_394
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有