ChatGPT を使って、Rust言語を勉強します。データ型→文字列型 篇

#### 質問1: Rust言語のデータ型を教えてください。

#### 回答1:
---

Rust言語には、以下のようなデータ型があります。

1. プリミティブ型
    ・ bool: 真偽値 (true/false)
    ・ char: Unicodeの単一の文字
    ・ 数値型
        ・ 整数型: i8, i16, i32, i64, i128, isize (符号あり), u8, u16, u32, u64, u128, usize (符号なし)
        ・ 浮動小数点数型: f32, f64
2. コンパウンド型
    ・ 配列 (array): 同じ型の要素を格納する固定長のデータ構造
    ・ タプル (tuple): 異なる型の要素を複数持つ固定長のデータ構造
    ・ 構造体 (struct): 異なる型の要素を持つカスタムのデータ構造
    ・ 列挙型 (enum): 有限個のバリアントから成るデータ型
3. ポインタ型
    ・ 参照 (reference): 値の所有権を移動せずに値にアクセスする方法
    ・ ポインタ (pointer): アドレスを表す型

Rust言語のデータ型は、静的型付けを採用しているため、コンパイル時に型の整合性がチェックされます。また、変数の所有権に関するルールが厳密に定義されており、メモリ安全性を保証することができます。

---

#### 質問2: Rust言語の文字列型の使い方を教えてください。


#### 回答2:
---

Rust言語には、以下の2つの文字列型があります。

1. 文字列スライス (string slice): &str
    ・　UTF-8エンコードされたバイト列を指す不変の参照型
    ・　文字列リテラルは、コンパイル時にプログラムのバイナリに埋め込まれた不変の&'static str型として扱われる
2. 文字列 (String)
    ・　可変のUTF-8エンコードされた文字列型
    ・　ヒープに格納される可変のバイト列を持つ
    ・　文字列スライスから作成することができる

文字列スライスは、通常は不変であるため、文字列の参照や操作に使用されます。一方、文字列は可変であるため、文字列の操作が必要な場合に使用されます。また、文字列スライスと文字列は相互変換が可能です。例えば、文字列スライスから文字列を作成するには、to_string()メソッドを使用することができます。

---

#### 質問3: Rust言語の文字列型を教えてください。

#### 回答3:

---

Rust言語の文字列型には、文字列スライス(&str)と文字列(String)の2つがあります。それぞれの使い方を以下に説明します。

文字列スライス(&str)の使い方
文字列スライスは、UTF-8エンコードされたバイト列を指す不変の参照型であり、通常は不変であるため、文字列の参照や操作に使用されます。以下は、文字列スライスの宣言と使用例です。

```rust
fn main() {
    let s: &str = "Hello, world!"; // 文字列リテラルは&'static str型であるため、明示的な型指定は不要
    println!("{}", s); // Hello, world!
    
    let slice = &s[0..5]; // スライスを作成する
    println!("{}", slice); // Hello
}
```


文字列(String)の使い方
文字列は、可変のUTF-8エンコードされた文字列型であり、文字列の操作が必要な場合に使用されます。以下は、文字列の宣言と使用例です。

```rust
fn main() {
    let mut s: String = String::from("Hello, "); // 可変の文字列を宣言する
    s.push_str("world!"); // 文字列を連結する
    println!("{}", s); // Hello, world!
    
    let slice = &s[0..5]; // 文字列スライスを作成する
    println!("{}", slice); // Hello
}
```

文字列の作成には、String::new()メソッドを使用することもできます。また、文字列スライスから文字列を作成するには、to_string()メソッドを使用することができます。

```rust
fn main() {
    let s1: String = String::new(); // 空の文字列を作成する
    let s2: String = "Hello, world!".to_string(); // 文字列スライスから文字列を作成する
    println!("{}", s2); // Hello, world!
}
```

Rustの文字列型には、メソッドが多数用意されているため、文字列の操作が非常に柔軟であると言えます。

---

#### 質問４: Rust言語の文字列型のメソッドを教えてください。

#### 回答４:

---

Rust言語の文字列型には、多数のメソッドが用意されています。以下に、代表的な文字列型のメソッドをいくつか紹介します。

##### 文字列スライス (&str)のメソッド
・ len(): 文字列の長さを返します。
・ chars(): 文字列をUnicodeスカラー値のシーケンスに変換するイテレータを返します。
・ as_bytes(): 文字列をUTF-8エンコードされたバイト列に変換するイテレータを返します。
・ split_whitespace(): 空白文字で文字列を分割するイテレータを返します。
・ starts_with(): 指定された文字列で始まるかどうかをチェックします。
・ ends_with(): 指定された文字列で終わるかどうかをチェックします。
・ trim(): 文字列の両端から空白文字を取り除きます。
・ to_string(): 文字列スライスをString型に変換します。

##### 文字列 (String)のメソッド
・ len(): 文字列の長さを返します。
・ capacity(): 文字列のヒープ領域で確保されている容量を返します。
・ push_str(): 文字列を連結します。
・ push(): 1文字を文字列の末尾に追加します。
・ remove(): 指定された位置の文字を文字列から削除します。
・ replace(): 指定された文字列を別の文字列に置換します。
・ split()、split_whitespace(): 指定された文字列で文字列を分割するイテレータを返します。
・ starts_with(): 指定された文字列で始まるかどうかをチェックします。
・ ends_with(): 指定された文字列で終わるかどうかをチェックします。
・ trim(): 文字列の両端から空白文字を取り除きます。
・ to_uppercase(): 大文字に変換します。
・ to_lowercase(): 小文字に変換します。
・ into_bytes(): 文字列をUTF-8エンコードされたバイト列に変換します。
・ into_boxed_str(): Box<str>型に変換します。

上記以外にも多数のメソッドが用意されています。詳細は公式ドキュメントを参照してください。

---