Rust所有権と参照

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

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);
}