如何构造并返回两个值,其中一个引用另一个[重复的]。

问题描述 投票:0回答:1

说一句 B 包含对一个 A:

struct A;

struct B<'t> {
    a_ref: &'t A,
}

我的目标是写一个简单的函数 f 使得下面的两个等同于(虽然可以使用堆)。

let (a, b) = f();
let a = A { };
let b = B { a_ref: &a };

我将如何写 f? 下面是一个尝试。

fn f<'t>() -> (A, B<'t>) {
    let a = A { };
    let b = B { a_ref: &a };
    (a, b)
}

但编译失败,出现了两个错误,我明白,但不知道如何避免。

error[E0515]: cannot return value referencing local variable `a`

error[E0505]: cannot move out of `a` because it is borrowed

我看到 为什么我不能在同一个结构中存储一个值和对该值的引用?. 上面,我写了两行代码,创建了一个名为 A 和a B. 我的问题不是为什么我抽象这两行字的尝试失败。我的问题是如何抽象出(类似)这两行代码。

是的,我的尝试是试图在一个结构中存储一个值和对该值的引用,但不管怎样,这不是目标。我知道这样做不会也不可能成功。这不是我想达到的目的。我的目标是一些无关紧要的东西,无论如何都可能实现。例如,返回一个闭包或使用一个宏可以工作。

rust lifetime
1个回答
3
投票

所以这里的问题是 f 是让出所有权 a 给其调用者。

  1. a 是在内部创建的 f. a 属于 f.
  2. f 返回 a,将所有权转移给其呼叫者。
  3. a 现在是 感动f 给调用者。

移动的问题是,它们有权移动内存中的变量。这将使对该变量的所有引用无效,因此每当一个变量被移动时,都不允许对它进行引用。

你可以做的是让 f 获知 a 并返回一个新的 B 参照 a: 例子.

© www.soinside.com 2019 - 2024. All rights reserved.