- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Vec<T>
有两种方法:
fn push(&mut self, value: T)
fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])
它们都采用对向量的可变引用。但是借用的范围好像不一样,例如:
fn works() {
let mut nums: Vec<i64> = vec![1,2,3,4];
nums.push(5);
println!("{}", nums.len());
}
fn doesnt_work() {
let mut nums: Vec<i64> = vec![1,2,3,4];
let (l,r) = nums.split_at_mut(2);
println!("{}", nums.len());
}
fn also_works() {
let mut nums: Vec<i64> = vec![1,2,3,4];
let _ = nums.split_at_mut(2);
println!("{}", nums.len());
}
doesnt_work
函数不编译,说 nums
上已经有一个可变借用并且它结束并且函数结束。如果我忽略从 split_at_mut
返回的值,问题就会消失.
最佳答案
在 doesnt_work
中对 nums
的借用将持续到变量 l
和 r
存在,因为向量(和向量本身)中的值实际上是借用的,现在只能通过 l
和 r
访问。
您可以通过将 l
和 r
的 let
放在一个结束的范围内来看到这种效果,因此借用也结束。例如,这段代码工作正常,但如果您尝试将 println!
移动到作用域内(大括号内),那么它将失败:
fn works() {
let mut nums = vec![1,2,3,4];
{
let (l, r) = nums.split_at_mut(2);
//println!("{}", nums.len()); //println! will fail here
}
println!("{}", nums.len());
}
在您的 also_works
示例中,您没有对结果做任何事情,因此借用立即丢失。基本上,编译器可以看到您无法通过方法的结果访问向量,因此您可以通过原始向量自由访问它们。
关于rust - 为什么 Vec<T>::split_at_mut 为范围的其余部分借用向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761370/
考虑以下代码(最小示例): use std::collections::HashMap; fn main() { let mut map: HashMap = HashMap::new();
我遇到了“错误[E0495]:由于需求冲突,无法推断出 autoref 的适当生命周期”,这个简单的函数: fn assign_split_at_mut(s: &'b mut &'a mut [T],
Vec有两种方法: fn push(&mut self, value: T) fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T]
有一个非常好的 split_at_mut 函数,它可以将 1 个切片分成 2 个...有没有办法撤消该操作,以便我可以再次返回到我的原始数组——假设我知道它们在内存中是连续的(因为我只是拆分它们) 问
我正在尝试从无法编译的嵌入式 Rust 示例中提取一些代码。许多这些旧的嵌入式示例无法编译,因为它们每晚都在使用,并且很快就会被破坏和忽视。 let mut buffer : [u8; 2048] =
我是一名优秀的程序员,十分优秀!