Rust所有権と参照

リテラルはプログラム内にハードコードされる

1
2
3
4
5
6
fn main(){
    let msg = "Hello!";
    let msg2 = msg;
    println!("{}", msg);
    println!("{}", msg2);
}

さまざまな値の所有権
L 所有権が移動するため、エラーになる

1
2
3
4
5
6
fn main(){
    let msg = String::from("Hello!");
    let msg2 = msg;
    println!("{}", msg);
    println!("{}", msg2);
}

数値の場合は参照している

関数の所有権

1
2
3
4
5
6
7
8
9
fn main(){
    let msg = String::from("Hello!");
    print_msg(msg);
    printl!("msg: {}", msg);
}
 
fn print_msg(msg:String) {
    println!("Message is {}", msg);
}

戻り値を設定して渡した関数から返してもらう

1
2
3
4
5
6
7
8
9
10
fn main(){
    let mut msg = String::from("Hello!");
    msg = print_msg(msg);
    println!("msg: {}", msg);
}
 
fn print_msg(msg:String)->String {
    println!("Message is \"{}\".", msg);
    msg
}

### 参照
値がある場所を示す
参照は利用した後にドロップされて破棄される

1
2
3
4
5
6
7
8
9
fn main(){
    let msg = String::from("Hello!");
    print_msg(&msg);
    println!("msg: {}", msg);
}
 
fn print_msg(msg:&String) {
    println!("Message is \"{}\".", msg);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main(){
    let msg = &String::from("Hello!");
    println!("msg: {}", msg);
    {
        let msg = print_msg(msg);
        println!("msg: {}", msg);
    }
    println!("msg: {}", msg);
}
 
fn print_msg(msg:&String)->String {
    let msg = String::from("*** ") + msg + " ***";
    println!("Message is \"{}\".", msg);
    msg
}

書き換え可能な値を参照で渡すことで参照した値を変更できます。

1
2
3
4
5
6
7
8
9
10
11
fn main(){
    let mut msg = String::from("Hello!");
    println!("msg: {}", msg);
    print_msg(&mut msg);
    println!("msg: {}", msg);
}
 
fn print_msg(msg:&mut String){
    msg.push_str("!!!!");
    println!("Message is \"{}\".", msg);
}

### スライス

1
2
3
4
5
fn main(){
    let msg = "Hello, world!";
    let world = &msg[7..12];
    println!("`{}` in `{}`.", world, msg);
}

可変文字列からのスライス

1
2
3
4
5
6
7
fn main(){
    let mut msg = String::from("Hello, world!");
    let world = &msg[7..12];
    println!("`{}` in `{}`.", world, msg);
    msg.insert_str(7, "RUST?");
    println!("`{}` in `{}`.", world, msg);
}

スライスを元に可変テキストを作る

1
2
3
4
5
6
7
8
9
10
11
fn main(){
    let mut msg = String::from("Hello, world!");
 
    let world = &msg[7..12];
    println!("`{}` in `{}`.", world, msg);
    msg.insert_str(7, "RUST?");
     
    let mut world = String::from(&msg[7..12]);
    world.push('!');
    println!("`{}` in `{}`.", world, msg);
}

配列スライス

1
2
3
4
5
fn main(){
    let data = [12,34, 56,78, 90];
    let part = &data[2..4];
    println!("{:?} in {:?}", part, data);
}
1
2
3
4
5
6
fn main(){
    let mut data = vec![12,34, 56,78, 90];
    let part = &data[2..4];
    data.insert(1, 999);
    println!("{:?} in {:?}", part, data);
}
1
2
3
4
5
6
7
fn main(){
    let mut data = vec![12,34, 56,78, 90];
    let mut part = data[2..4].to_vec();
    data.insert(1, 999);
    part.push(-1);
    println!("{:?} in {:?}", part, data);
}