📜  Rust参考和借阅

📅  最后修改于: 2021-01-08 13:37:18             🧑  作者: Mango

锈参考和借用

引用是作为参数传递给函数的地址。借贷就像当我们借用某种东西,当我们完成后,我们将其归还。引用和借阅是相互的,即,当引用被释放时,借阅也将结束。

为什么借钱?

之所以使用借入概念是因为以下原因:

  • 借用允许对单个资源有多个引用,但仍然服从于拥有“单个所有者”。
  • 引用就像C中的指针一样。
  • 引用是一个对象。引用有两种类型,即可变引用和不可变引用。可变引用被移动,而不变引用被复制。

让我们通过一个例子来理解这一点。

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

输出:

length of the string 10

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

 let str=String::from("javaTpoint");
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;
}

以下是上述程序的输出:

在上面的示例中,由于&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,该引用由&i32类型的变量y指向。现在,我们可以更改“ y”变量引用的值。我们指定9个值,即* y = 9。因此,值x也将变为9,这是两个变量所引用的相同存储位置。

可变引用的限制

  • 在特定范围内,我们只能对一个数据进行可变引用。

例如:

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

在上述情况下,编译器将引发错误,因为它由两个可变引用组成,这在Rust语言中是不可能的。

  • 如果程序中存在不可变的引用,则程序中不能有可变的引用。

例如:

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

在上述情况下,编译器将引发错误,因为在拥有不可变的引用的同时我们不能拥有可变的引用。