リテラルはプログラム内にハードコードされる
fn main(){ let msg = "Hello!"; let msg2 = msg; println!("{}", msg); println!("{}", msg2); }
さまざまな値の所有権
L 所有権が移動するため、エラーになる
fn main(){ let msg = String::from("Hello!"); let msg2 = msg; println!("{}", msg); println!("{}", msg2); }
数値の場合は参照している
関数の所有権
fn main(){ let msg = String::from("Hello!"); print_msg(msg); printl!("msg: {}", msg); } fn print_msg(msg:String) { println!("Message is {}", msg); }
戻り値を設定して渡した関数から返してもらう
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 }
### 参照
値がある場所を示す
参照は利用した後にドロップされて破棄される
fn main(){ let msg = String::from("Hello!"); print_msg(&msg); println!("msg: {}", msg); } fn print_msg(msg:&String) { println!("Message is \"{}\".", msg); }
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 }
書き換え可能な値を参照で渡すことで参照した値を変更できます。
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); }
### スライス
fn main(){ let msg = "Hello, world!"; let world = &msg[7..12]; println!("`{}` in `{}`.", world, msg); }
可変文字列からのスライス
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); }
スライスを元に可変テキストを作る
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); }
配列スライス
fn main(){ let data = [12,34, 56,78, 90]; let part = &data[2..4]; println!("{:?} in {:?}", part, data); }
fn main(){ let mut data = vec![12,34, 56,78, 90]; let part = &data[2..4]; data.insert(1, 999); println!("{:?} in {:?}", part, data); }
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); }