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