这是使可变变量再次在锈不变的正确方法吗?

问题描述

我创建了一个简单的列表,该列表具有可变的推送行为,但无需对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);
}