【Rust】Rust ~ struct/impl/trait ~

◾️はじめに

Rust を少しずつ触っているが、
Rustには class がないことを知ったので
掘り下げてみた

目次

【0】Rustには class がない
 1)Rust でのオブジェクト指向
 2)補足:AIに「Classがないのは流行り?」って聞いてみた
【1】struct
 1)サンプル
【2】impl
 1)サンプル
 2)ジェネリックを使った場合
【3】trait
 1)impl トレイト名 for 型名 {}

【0】Rustには class がない

* (Go もそうだが)Rustには class がない

1)Rust でのオブジェクト指向

* Rustでは、代わりに以下を使って、実装する
 + struct + impl
 + trait による追加機能 ... 継承禁止(安全性確保)

struct + impl + trait

trait Greet {
    fn greet(&self);
}

struct Person {
    name: String,
}

impl Greet for Person {
    fn greet(&self) {
        println!("Hello, {}!", self.name);
    }
}

fn main() {
    let p = Person { name: "Mike".into() };
    p.greet();
}

2)補足:AIに「Classがないのは流行り?」って聞いてみた

 ChatGPTに
「GoやRustにはClassがないですが、最近の流行りですか?」
って聞いてみた

回答抜粋

結論から言うと、Go や Rust に「class がない(または class を中心にしない)」
のは “最近の流行り” というより、「現代的言語設計の方向性」 です。

1. 「class = 複雑な継承」を避けたい
2. class がなくても OOP 的な書き方ができる
3. コンポジション(構造を組み合わせる)が主流に

近年のトレンドであることは間違いない

Rust(2015〜)
Go(2009〜)
Swift(2014〜)
TypeScript でも class 継承より interface×struct-like design へ
Python も近年 dataclass や pydantic などで「構造体的」設計が普及

多くの新しい言語が 「伝統的 OOP(class + 継承)」の弱点を補う方向に
シフトしています。

【1】struct

* C言語のstruct(構造体)と同じ
 => データのグループを定義

1)サンプル

struct User {
    id: u32,
    name: String,
    age: u8,
    sex: char,
    is_active: bool,
    updated_at: DateTime<Utc>,
    create_at: DateTime<Utc>,
}

【2】impl

* 構造体などの型にメソッドを追加するために使用

https://doc.rust-jp.rs/rust-by-example-ja/generics/impl.html

1)サンプル

struct Point {
    x: u32,
    y: u32,
}

impl Point {
    fn x(&self) -> u32 {
        self.x
    }
    fn y(&self) -> u32 {
        self.y
    }
}

fn main() {
    let point = Point { width: 30, height: 50 };
    println!("Result: {}", point.x());
}

2)ジェネリックを使った場合

struct Val <T> {
    val: T,
}

// impl of Val for a generic type `T`
// ジェネリック型`T`の場合のメソッドをValに対して実装
impl<T> Val<T> {
    fn value(&self) -> &T {
        &self.val
    }
}

fn main() {
    let x = Val { val: 3i32 };
    println!("{}", x.value());
}

【3】trait

* Scala などのTrait(トレイト)と同じ
 => 共通の振る舞いを定義する

https://doc.rust-jp.rs/book-ja/ch10-02-traits.html
https://doc.rust-jp.rs/rust-by-example-ja/trait/impl_trait.html

1)impl トレイト名 for 型名 {}

trait UserAction {
    fn greet(&self) -> String;
}

struct User {
    id: u32,
    name: String,
}

impl UserAction for User {
    fn greet(&self) -> String {
        format!("Hello, {}", self. name)
    }
}

関連記事

Rust ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/22/234808
Rust ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/11/26/224648
Rust ~ enum / 列挙型 ~
https://dk521123.hatenablog.com/entry/2025/12/03/000831
Rust ~ 保有権 ~
https://dk521123.hatenablog.com/entry/2023/05/04/213726
Rust ~ mod ~
https://dk521123.hatenablog.com/entry/2025/11/29/221911
Rust ~ Option型 ~
https://dk521123.hatenablog.com/entry/2025/12/01/223443