我正在学习Rust and Play通过一些场景来看看它是如何运行的.当将可变引用传递给函数,然后将另一个可变引用赋给它时,Rust编译器似乎希望引用的变量与最初引用的变量一样长.

但是,因为我实际上是将引用交换到其他地方的point,所以它永远不会影响调用函数的引用.它仍然会指向Foo,它是完全活着的.那么为什么foo2要和foo一样长寿呢?这看起来像是在期望替换原始引用中的引用...

struct Foo {
    x: u32,
    y: u32
}

fn do_something(mut foo: &mut Foo) {
    foo.x = 4;
    foo.y = 5;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
    let mut foo2 = Foo{x: 10, y: 20};
    foo = &mut foo2;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
}

fn main() {
    let mut foo = Foo{x: 1, y: 2};
    do_something(&mut foo);
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
}

以下是编译器所说的:

error[E0597]: `foo2` does not live long enough
  --> main.rs:11:11
   |
6  | fn do_something(mut foo: &mut Foo) {
   |                          - let's call the lifetime of this reference `'1`
...
10 |     let mut foo2 = Foo{x: 10, y: 20};
   |         -------- binding `foo2` declared here
11 |     foo = &mut foo2;
   |     ------^^^^^^^^^
   |     |     |
   |     |     borrowed value does not live long enough
   |     assignment requires that `foo2` is borrowed for `'1`
12 |     println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
13 | }
   | - `foo2` dropped here while still borrowed

error: aborting due to previous error

For more information about this error, try `rustc --explain E0597`.

推荐答案

问题是,&mut Footype包含一个生命周期,而这个生命周期比foo2的生命周期要长.这是一个问题,因为您作为编译器假定生命周期很长,您可以利用这一点.例如:

fn do_something(mut foo: &mut Foo) -> &mut Foo {
    foo.x = 4;
    foo.y = 5;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
    let mut foo2 = Foo{x: 10, y: 20};
    foo = &mut foo2;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
    foo
}

在这里,由于生存期的省略,返回类型的生存期与foo的生存期相同.但我们返回foo:这肯定没问题.然而,这段代码并不好用:它显然有一个免费后使用的功能.唯一有效的结论是分配foo = &mut foo2是无效的.

如果您声明一个新变量,并且它的生命周期较短,那么它将起作用:

fn do_something(foo: &mut Foo) {
    let mut foo = foo;
    foo.x = 4;
    foo.y = 5;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
    let mut foo2 = Foo{x: 10, y: 20};
    foo = &mut foo2;
    println!("foo.x = {}\nfoo.y = {}", foo.x, foo.y);
}

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

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

新创建的变量的绑定生存期

交换引用时的生命周期

在Rust中判断编译时是否无法访问

铁 rust 中双倍或更多换行符的更好练习?

允许 rust 迹 struct 条目具有多种类型

用于实现获取 struct 体 id 的特征规范

在 Rust 中用问号传播错误时对类型转换的困惑?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

提取指向特征函数的原始指针

如何在 Rust 中将函数项变成函数指针

Rust 中指向自身的引用如何工作?

在1.5n次比较中找到整数向量中的最大和次大整数

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

Rust与_有何区别?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

如何构建包含本地依赖项的 docker 镜像?

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

返回引用的返回函数