[back]

2023-02-02 21:11:39 +09:00

# 雑記

## Rust

fn main() {
    let mut vector: Vec<char> = "Hello world!".chars().collect::<Vec<_>>();
    // ここでvec[0]を参照
    let reference: Option<&char> = vector.get(0);
    match reference {
        Some(r) => {
            // ここでvec[0]を削除
            vector.remove(0);     
            ^^^^^^^^^^^^^^^^^
            cannot borrow `vector` as mutable because it is also borrowed as immutable
            println!("{}", r);
        },
        None => {}
    }
}

このコードは不変参照があるにも関わらずremoveで可変な参照を作ろうとしてるので当然動かない。 しかしこうすると動く:

fn main() {
    let mut vector: Vec<char> = "Hello world!".chars().collect::<Vec<_>>();
    // ここでvec[0]を参照
    let reference: Option<&char> = vector.get(0);
    match reference {
        Some(_) => {
            // ここでvec[0]を削除
            let r = vector.remove(0);
            println!("vec[0] = {}", r);
        },
        None => {}
    }
}

その後の処理で使われないなら勝手にSome以降のスコープが始まるときにdropして可変参照作ってもいい感じにしてくれるんだろうか。便利なんだけどあまりにも空気読めすぎててちょっとビックリした