AI:GPT5.2 Thnking

プロンプト

プログラミング言語 Rust の基礎的な文法を学習したいです。
関数、クラス、インターフェース、構造体、プリミティブ型、変数の宣言方法に相当する部分について解説をお願いします。

回答

Rust を **C# の感覚(関数 / クラス / インターフェース / 構造体 / プリミティブ / 変数宣言)**に対応づけて、基礎文法をまとめます。
(Rust には「クラス」はありません。代わりに struct + impl + trait の組み合わせで表現します)


1) 変数の宣言(C# の var / readonly っぽい話)

Rust は デフォルト不変 です。

fn main() {
    let x = 10;          // 不変(再代入できない)
    // x = 11;           // エラー
 
    let mut y = 10;      // 可変(再代入できる)
    y = 11;
 
    let z: i32 = 123;    // 型注釈も書ける
}

スコープ{}
シャドーイング(同名で上書き宣言)もよく使います:

let n = "123";
let n = n.len(); // 別の型に変えてもOK(新しい変数として宣言)

2) プリミティブ型(数値 / bool / char など)

よく使うもの:

  • 整数: i8 i16 i32 i64 i128 isize / u8 ... usize

  • 浮動小数: f32 f64

  • 真偽: bool

  • 文字: char(Unicode 1文字)

  • 文字列: &str(参照文字列) と String(所有する可変文字列)

let a: i32 = -10;
let b: u32 = 10;
let pi: f64 = 3.1415;
let ok: bool = true;
let c: char = 'あ';
 
let s1: &str = "hello";
let mut s2: String = String::from("hello");
s2.push('!');

C# でいうと
&str は「借りてる view」、String は「所有してる実体」みたいな感覚です。


3) 関数(C# のメソッド / static 関数)

戻り値の型は -> T。最後の式を ; なしで書くと return になります。

fn add(a: i32, b: i32) -> i32 {
    a + b
}
 
fn main() {
    let x = add(2, 3);
    println!("{x}");
}

早期 return:

fn clamp01(x: i32) -> i32 {
    if x < 0 { return 0; }
    if x > 1 { return 1; }
    x
}

4) 構造体(struct)= C# の「class / struct の器」部分

Rust の structデータの箱。まずはフィールドを定義します。

struct User {
    id: u64,
    name: String,
}
 
fn main() {
    let u = User { id: 1, name: "Alice".to_string() };
    println!("{}", u.id);
}

更新構文(可変なら代入、または「構築し直す」):

let u2 = User { name: "Bob".to_string(), ..u }; // 残りは u から

5) 「クラス相当」= struct + impl(メソッド / コンストラクタ)

Rust はクラスがない代わりに、impl ブロックでメソッドを生やします。

struct User {
    id: u64,
    name: String,
}
 
impl User {
    // いわゆるコンストラクタ的な関連関数(static)
    fn new(id: u64, name: impl Into<String>) -> Self {
        Self { id, name: name.into() }
    }
 
    // インスタンスメソッド(self)
    fn greet(&self) -> String {
        format!("Hi, I'm {}", self.name)
    }
 
    // 可変メソッド(&mut self)
    fn rename(&mut self, name: impl Into<String>) {
        self.name = name.into();
    }
}
  • &self は C# の this(参照)に近い

  • &mut self は「this を変更する」宣言

  • Self はその型自身(C# の this.GetType() じゃなく型名の省略)


6) インターフェース相当= trait

Rust の traitインターフェースです。

trait Printable {
    fn print(&self);
}

実装は impl Trait for Type

struct User { name: String }
 
trait Printable {
    fn print(&self);
}
 
impl Printable for User {
    fn print(&self) {
        println!("User(name={})", self.name);
    }
}

6.1 デフォルト実装(C# の default interface method っぽい)

trait Greeter {
    fn name(&self) -> &str;
 
    fn greet(&self) { // デフォルト実装
        println!("Hello, {}!", self.name());
    }
}

7) (超重要)Rust の「型の使い分け」早見(C# アナロジー)

  • struct : クラス/構造体の“データ”

  • impl : メソッド定義(クラス本体のメソッドに相当)

  • trait : interface

  • enum : discriminated union(C# だと OneOf / Result 的なやつを標準で持ってる)

  • let : 変数宣言(デフォルト不変)

  • mut : 可変にするキーワード