rust `let y = x` vs `let &y = &x`

nqwrtyyt  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(142)

下面的two assignments有什么区别?

let mut x = 1;
    let mut y = x; // (1)
    let &mut mut y = &mut x; // (2)

字符串
看起来它们的行为是一样的。#2是否为您提供了#1所不具备的附加功能?
(the mut在这里容易混淆,但重点是两边都没有&和两边都没有&之间的区别)

xe55xuns

xe55xuns1#

(3)等同于:

let mut y = *&mut x;

字符串
如果x的类型是Copy,那么(2)和(3)是相等的:都创建了一个副本(关于别名有一些深奥的区别((3)使指向x的现有指针无效,但(2)不会),但通常它们并不重要)。
但是,如果x不是Copy,那么(2)将工作并将x移动到y中,但(3)不会,因为您无法移出引用。

jum4pzuy

jum4pzuy2#

1.第一个变量是一个可变变量。x的所有权被建立
1.第二个方法创建一个新的可变变量y,并将x的值赋给它。xy是独立的,因此任何一个变量的值变化都不会影响另一个变量。
1.第三个是错误,它试图多次借用可变变量
你在尝试这样的东西吗?:let y_ref = &mut x;
here

fn main() {
    let mut x = 1;

    {
        let y = &mut x;

        println!("Before: y = {}", y);

        *y = 42; // Change the value through the reference
        
    }

    println!("After: x = {}", x);
}

字符串
&mut不是像(2)中那样独立,而是创建一个引用,任何更改都将反映在引用的变量上

os8fio9y

os8fio9y3#

int y = x;处理所有权并可能复制或移动值,而let &mut mut y = &mut x;(假设预期的语法是let y = &mut x;)创建对同一值的可变引用,而不转移所有权。前者允许独立操作y和x,而后者链接y和x,以便通过y的更改直接影响x

相关问题