所有権まわりの話
文字列に関する型
Section titled “文字列に関する型”- 意味:1文字(Unicodeスカラー値)
- サイズ:常に4バイト(UTF-32的な表現)
- 性質:プリミティブ型であり
Copy
。 - 用途:1文字だけを使いたいとき
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
型の変数である。
s1
をs2
に代入すると、String
型のデータがコピーされる。
所有権と関数
Section titled “所有権と関数”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);}