## 文字列に関する型
char
- 意味:1文字(Unicodeスカラー値)
- サイズ:常に4バイト(UTF-32的な表現)
- 性質:プリミティブ型であり
Copy。 - 用途:1文字だけを使いたいとき
// main.rs
let c: char = 'あ';
println!("{}", c)str
- 意味: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型の変数である。
:::note
文字列リテラルは読み取り専用・固定長であり、その型は&'static strと表される。
:::
s1をs2に代入すると、String型のデータがコピーされる。
## 所有権と関数
:::tip[引数としての変数] 関数の引数に変数を渡すと、変数の代入のようにムーブやコピーされる。 したがって、関数の引数として元となったものは使えなくなる。
Copy Traitなオブジェクトであればムーブをしないため、元の変数はそのまま利用できる。
:::
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);
}