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: 可変にするキーワード