为了理解Rust中的所有权和借款,我遇到了这个场景,其中我创建了一个对象a(它应该是所有者),然后将其borrow 到b中.然后,我试着跟踪a:

#[derive(Debug)]
struct Struct1;

#[derive(Debug)]
struct Struct2;

fn main() {
    let a = Struct1;
    let b = &a;

    let a = Struct2;
    
    println!("{:?} {:?}", a, b);
}

问题是,我预计这会失败,但它实际上工作,输出:

Struct2 Struct1

如果我影子a,借来的b的主人在哪里?

推荐答案

第一个a仍然是Struct1的所有者,其生命周期直到Main内的最后一次使用,即当bprintln!之后被丢弃时借入结束.隐藏会创建一个新绑定,该绑定不会影响前一个绑定,但会使其在当前范围内不可见.

因此,这个程序等同于(只是语法上的糖)一个程序:

#[derive(Debug)]
struct Struct1;

#[derive(Debug)]
struct Struct2;

fn main() {
    let a_1 = Struct1;
    let b = &a_1;

    let a_2 = Struct2;
    
    println!("{:?} {:?}", a_2, b);
}

其中a_1a_2的绑定之后不直接相互作用.

Rust相关问答推荐

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

什么样的 struct 可以避免使用RefCell?

使用Rust s serde_json对混合数据类型进行优化'

使用pyo3::Types::PyIterator的无限内存使用量

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

这种获取-释放关系是如何运作的?

integer cast as pointer是什么意思

如何计算迭代器适配器链中过滤的元素的数量

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

用于判断整数块是否连续的SIMD算法.

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

如何实现Deref;多次;?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

哪些特征通过 `Deref` 而哪些不通过?

如何用另一个变量向量置换 rust simd 向量?

如何重写这个通用参数?

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?