【发布时间】:2019-02-02 06:39:33
【问题描述】:
我是 Rust 新手,正在尝试学习使用借用检查器的惯用方式。
我正在尝试编写一个简单的函数,它接收一个切片(数据类型的泛型)并返回最后一个元素,这样我就可以在之后改变切片。天真的实现给了我一个错误:
fn last_element<T>(list: &[T]) -> T {
list[list.len() - 1]
}
fn main() {
let mut slice = [1, 2, 3, 4, 5];
let x = last_element(&slice);
println!("{}", x);
// I want to be able to mutate slice after extracting last element
slice[2] = 17;
}
错误是cannot move out of type[T], a non-copy slice。我看到一种解决方法是让函数返回一个引用:
fn last_element<T>(list: &[T]) -> &T {
&list[list.len() - 1]
}
fn main() {
let mut slice = [1, 2, 3, 4, 5];
let x = last_element(&slice);
println!("{}", x);
// I want to be able to mutate slice after extracting last element
slice[2] = 17;
}
但是我收到slice[2] = 17 的错误,因为在分配x 时借用了切片。我确实希望能够在调用last_element 后进行变异。我发现的一种解决方法是取消引用x,我认为这会消耗借用:
fn last_element<T>(list: &[T]) -> &T {
&list[list.len() - 1]
}
fn main() {
let mut slice = [1, 2, 3, 4, 5];
let x = *last_element(&slice);
println!("{}", x);
// I want to be able to mutate slice after extracting last element
slice[2] = 17;
}
这是实现能够获取切片的最后一个元素并在之后仍然改变切片的目标的最惯用的方法吗?或者,如果我编写了好的代码,我什至不应该再做突变?
【问题讨论】: