问题描述
我创建了一个简单的列表,该列表具有可变的推送行为,但无需对peek fn具有相同的可变性
fn peek(){
let mut list = List::new();//take a mutable ref here to perform push
list.push(1);
let list = list; //shadow the variable with the same name and take a immut ref
assert_eq!(list.peek().unwrap(),&1);
}
解决方法
您的方法很好。通常会包含这样的评论:
let list = list; // discard mut
另一种实现方法(复杂性,可读性和关注点分离是否更好,这是有争议的)是分离初始化。
fn peek() {
let list = {
let mut list = List::new();
list.push(1);
list
};
assert_eq!(list.peek().unwrap(),&1);
}
,
您的解决方案足够正确。这样做可能会更具可读性:
fn peek(){
let list = {
let mut li = List::new();//take a mutable ref here to perform push
li.push(1);
li
};
assert_eq!(list.peek().unwrap(),&1);
}
但您的情况还有另一种选择:
fn peek(){
let list = std::iter::once(1).collect::<List<_>>();
assert_eq!(list.peek().unwrap(),&1);
}