コンテンツにスキップ

所有権まわりの話

  • 意味:1文字(Unicodeスカラー値)
  • サイズ:常に4バイト(UTF-32的な表現)
  • 性質:プリミティブ型でありCopy
  • 用途:1文字だけを使いたいとき
main.rs
let c: char = 'あ';
println!("{}", c)
  • 意味:UTF-8 バイト列としてエンコードされた文字列全体
  • サイズ:コンパイル時にはわからない可変長
  • 性質:自身はSizedではないので、必ず参照型(&str)として扱う
  • 用途:複数の文字をまとめて扱いたいとき
let s: &str = "こんにちは";
let s = String::from(s);
for b in s.chars() {
println!("{} {:x?}", b, b.to_string().as_bytes());
}

文字列を例にして変数の代入時に生じていることを理解する。

let s1 = String::from("hello");
let s2 = s1;

変数s1は、文字列リテラルhelloから作られるString型の変数である。

s1s2に代入すると、String型のデータがコピーされる。

fn main() {
let s = String::from("hello"); // sがスコープに入る
takes_ownership(s);
println!("{}", s); // コンパイルエラー
let x = 5; // i32
makes_copy(x);
println!("{}", x) // i32はCopy Traitなのでmoveされない
}
fn takes_ownership(some_string: String) {
println!("{}", some_string);
}
fn makes_copy(some_integer: i32) {
println!("{}", some_integer);
}