如何构造并返回两个值,其中一个引用另一个[重复的]。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何构造并返回两个值,其中一个引用另一个[重复的]。相关的知识,希望对你有一定的参考价值。
说一句 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
. 我的问题不是为什么我抽象这两行字的尝试失败。我的问题是如何抽象出(类似)这两行代码。
是的,我的尝试是试图在一个结构中存储一个值和对该值的引用,但不管怎样,这不是目标。我知道这样做不会也不可能成功。这不是我想达到的目的。我的目标是一些无关紧要的东西,无论如何都可能实现。例如,返回一个闭包或使用一个宏可以工作。
答案
所以这里的问题是 f
是让出所有权 a
给其调用者。
a
是在内部创建的f
.a
属于f
.f
返回a
,将所有权转移给其呼叫者。a
现在是 感动 从f
给调用者。
移动的问题是,它们有权移动内存中的变量。这将使对该变量的所有引用无效,因此每当一个变量被移动时,都不允许对它进行引用。
你可以做的是让 f
获知 a
并返回一个新的 B
参照 a
: 例子.
以上是关于如何构造并返回两个值,其中一个引用另一个[重复的]。的主要内容,如果未能解决你的问题,请参考以下文章