リテラルはプログラム内にハードコードされる
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); } |