読者です 読者をやめる 読者になる 読者になる

Lifetimes

rust

https://doc.rust-lang.org/book/lifetimes.html を少々。

fn main() {
    let r;              // Introduce reference: r
    {
        let i = 1;      // Introduce scoped value: i
        r = &i;         // Store reference of i in r
    }                   // i goes out of scope and is dropped.

    println!("{}", r);  // r still refers to i
}

はエラーになる。

References and Borrowing #2

rust

https://doc.rust-lang.org/book/references-and-borrowing.html

変数書き換え不可にするのは大変なんだな。

    let mut x = 5;
    {
        let y = &mut x; // -+ &mut borrow starts here
        *y += 1;        //  |
    }                   // -+ ... and ends here
    println!("{}", x);  // <- try to borrow x here

References and Borrowing

rust

https://doc.rust-lang.org/book/references-and-borrowing.html を途中まで。 特別気になる箇所はなし。

fn main() {

    fn sum_vec(v: &Vec<i32>) -> i32 {
        return v.iter().fold(0, |a, &b| a + b);
    }

    fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 {
        let s1 = sum_vec(v1);
        let s2 = sum_vec(v2);
        s1 + s2
    }

    let v1 = vec![1, 2, 3];
    let v2 = vec![4, 5, 6];

    let answer = foo(&v1, &v2);
    println!("{}", answer);
}

Owership #2

https://doc.rust-lang.org/book/ownership.html

単一(スカラ?)な変数はコピーなので、代入元でも代入先でも使えるが、 複数(ベクタ)の要素の変数は参照なので、代入先では使えるが、代入元では使用不可とするみたいな話なのかな。

let a = 3;
let v1 = vec![1,2,3];

let b = a;

println!("{}, {}", a, b); // 代入元(a)、代入先(b)どちらもOK

let v2 = v1;

// println!("{}", v1[0]); // 代入元(v1)はダメ
println!("{}", v2[0]);  // 代入先(v2)はOK

Owership

rust

https://doc.rust-lang.org/book/ownership.html を途中まで。

関数の中で関数が宣言できるらしい。 コメントにしている箇所は、コメントアウトするとエラーになる処理。

fn main() {
    let v = vec![1, 2, 3];

    println!("v[0] is: {}", v[0]);
    let v2 = v;

    // println!("v[0] is: {}", v[0]);
    println!("v[0] is: {}", v2[0]);

    fn take(v: Vec<i32>) {
        println!("v[0] is: {}", v[0]);
    }

    let v = vec![1, 2, 3];

    take(v);

    //println!("v[0] is: {}", v[0]);
}

Vectors

rust

https://doc.rust-lang.org/book/vectors.html

書き換え可能な参照と、書き換え不可能な参照がある。

fn main() {
    let mut v = vec![1, 2, 3, 4, 5];

    for i in &v {
        // *i = *i + 1; // 不可能
        println!("A reference to {}", i);
    }

    for i in &mut v {
        *i = *i + 1;
        println!("A mutable reference to {}", i);
    }

    for i in v {
        println!("Take ownership of the vector and its element {}", i);
    }
}

Loops

rust

https://doc.rust-lang.org/book/loops.html

Loop labels( 条件付きgoto )がよい。 サンプルコードはcontinueだけだったが、breakでも意図通り動く。

fn main() {
    'outer: for x in 0..10 {
        'inner: for y in 0..10 {
            if x % 2 == 0 { continue 'outer; } // continues the loop over x
            if y % 2 == 0 { continue 'inner; } // continues the loop over y
            println!("x: {}, y: {}", x, y);
        }
    }

    'outer2: for x in 0..10 {
        'inner2: for y in 0..10 {
            if x % 2 == 0 { continue 'outer2; } // continues the loop over x
            if x % 5 == 0 { break    'outer2; } // break     the loop over x
            if y % 2 == 0 { continue 'inner2; } // continues the loop over y
            println!("x: {}, y: {}", x, y);
        }
    }
}
$ cargo run
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/4_6_loops`
x: 1, y: 1
x: 1, y: 3
x: 1, y: 5
x: 1, y: 7
x: 1, y: 9
x: 3, y: 1
x: 3, y: 3
x: 3, y: 5
x: 3, y: 7
x: 3, y: 9
x: 5, y: 1
x: 5, y: 3
x: 5, y: 5
x: 5, y: 7
x: 5, y: 9
x: 7, y: 1
x: 7, y: 3
x: 7, y: 5
x: 7, y: 7
x: 7, y: 9
x: 9, y: 1
x: 9, y: 3
x: 9, y: 5
x: 9, y: 7
x: 9, y: 9
x: 1, y: 1
x: 1, y: 3
x: 1, y: 5
x: 1, y: 7
x: 1, y: 9
x: 3, y: 1
x: 3, y: 3
x: 3, y: 5
x: 3, y: 7
x: 3, y: 9