我在使用 Rust 2018 时遇到了借用检查器问题,但找不到解决方案。基本上,我有一个函数接受对 vec 的可变引用,并且在其执行的第一部分将相同的 vec 作为不可变引用传递到另一个函数中。后一个函数返回一个新的拥有值 - 或者至少我打算这样做。对我来说,问题是编译器似乎认为函数调用的不可变借用持续到外部函数结束。
不幸的是,这不是一个简单地通过用大括号括起来就能解决的问题(无论如何都不应该这样,因为我使用的是 Rust 2018)。此外,虽然我发现了许多似乎涉及类似问题的问题(例如this、this、this和this),但我无法找到任何其他直接解决此问题的内容。或者至少,我无法从中弄清楚我应该做什么。至关重要的是,大多数其他类似问题要么似乎涉及引用作为返回类型,要么只是非词汇生命周期之前的问题。
我在Rust Playground中创建了一个可执行的 MVE ,以及完整的程序,以防有帮助。我把代码贴在下面,供参考:
// This function was blatantly borrowed from a Stack Overflow post
// but unfortunately I lost track of which one.
fn compute_mean_of_vec<'g, T>(input_vec: &'g [T]) -> T
where
T: Copy
+ num::Zero
+ std::ops::Add<T, Output = T>
+ std::ops::Div<T, Output = T>
+ num::FromPrimitive
+ std::iter::Sum<&'g T>,
{
let sum: T = …Run Code Online (Sandbox Code Playgroud) 我正在为一个图像处理任务工作(这里并没有太大的相关性),我偶然发现F#的Option类型的行为让我感到惊讶,因为它执行了大于(>)的比较.在Stack Overflow,F#docs或更广泛的网络上,我找不到任何直接解释我应该期待的东西(下面有更多内容).
我正在看的具体部分看起来像:
let sort3Elems (arr: byte option []) =
if arr.[0] > arr.[1] then swap &arr.[0] &arr.[1]
if arr.[1] > arr.[2] then swap &arr.[1] &arr.[2]
if arr.[0] > arr.[1] then swap &arr.[0] &arr.[2]
Run Code Online (Sandbox Code Playgroud)
我将在四个字节选项的数组中传递(如果你想知道为什么这看起来很奇怪并且超级无功能,现在我故意试图重新实现一个算法的非函数式语言实现教科书).我期待这会导致编译器错误,它会抱怨无法直接比较选项.令我惊讶的是,这编译好了.好奇,我在F#Interactive中测试了它,其结果如下所示:
let arr: byte option [] = Array.zeroCreate 4;;
val arr : byte option [] = [|None; None; None; None|]
> arr.[0] <- Some(127uy);;
val it : unit = ()
> arr.[2] <- Some(55uy);;
val it : unit = ()
> arr.[0] > arr.[2];;
val it …Run Code Online (Sandbox Code Playgroud)