2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rust学習日記2~Classねぇの?~

Posted at

Rustでオブジェクトつくりたい

まんまなんですが、オブジェクト作ると言うとclassですよね。
じゃぁ他言語のようにClassを……ないやんけGoみたいに色々としないといけないの!?
安心してください、高級言語ですよ。
とにかく難しいRustさん!?

struct

雑に言ってしまえば、クラスって構造体に色々くっついた何かですよね?(雑にぶん投げんな)
Pythonとかは構造体がなく、クラスで構造体も表現しちゃうって3年前にIoTの現場でげろげろしてた自分が言ってた!!
それとはちがい、Rustは構造体が存在するので、作っちゃいましょう

struct Car {
    make: String,
    model: String,
    year: u32,
    engine: String,
}

みんな大好き車構造体です。オブジェクト指向の解説の時に、いやと言うほどみたんじゃないでしょうか?
これだとメンバ関数とかコンストラクタもないので、クラスと同じようには使えないです。
Rustってメソッドが前回の値の所有権の関係上やたら面倒臭いことになるって聞いたんですがまじっすかね?

impl

さてすでに作られている車構造体に対して、実装を定義していきましょう。Implementationであってるよね?(調べなさいよ)

// 車構造体
struct Car {
    make: String,
    model: String,
    year: u32,
    engine: String,
}
// 実装
impl Car {
    fn new(make: &str, model: &str, year: u32, engine: &str) -> Self {
        Car {
            make: make.to_string(),
            model: model.to_string(),
            year,
            engine: engine.to_string(),
        }
    }

    fn display_info(&self) {
        println!("{} {} ({}) - Mileage: {} km", self.year, self.make, self.model, self.engine);
    }
}

Rustにはコンストラクタなんて便利なものはないので、自前でnewを実装しコンストラクタ代わりにします。
「コンストラクターがなければ、作ればいいじゃない」精神ですね。マリー・アントワネットかよ(史実では言っていない)
impleは文字通りCarのコンストラクターやメソッドなど実装を作っています。これで基本的にはクラスはできます。

// 車構造体
struct Car {
    make: String,
    model: String,
    year: u32,
    engine: String,
}
// 実装
impl Car {
    fn new(make: &str, model: &str, year: u32, engine: &str) -> Self {
        Car {
            make: make.to_string(),
            model: model.to_string(),
            year,
            engine: engine.to_string(),
        }
    }

    fn display_info(&self) {
        println!("{} {} ({}) - Mileage: {} km", self.year, self.make, self.model, self.engine);
    }
}
fn main() {
    let mut my_car = Car::new("Toyota", "Corolla", 2020, "V8");

    my_car.display_info();
}

ね?簡単でしょ。

抽象クラスは?

クラスといえば抽象化が欲しいですよね。もろちんそちらの方もご用意されています。

trait Adder {
    fn add(&self, a: i32, b: i32) -> i32;
}

struct MyClass;

impl Adder for MyClass {
    fn add(&self, a: i32, b: i32) -> i32 {
        a + b
    }
}

fn main() {
    let obj = MyClass;
    obj.add(1 + 2);
}

Adderの抽象実装をMyClassに入れるという意味となります。へー(興味薄い)
いまいち、これだけでクリーンアーキテクチャやろうとしたら爆発しちゃいそうなんで……ちょっと何か手を考えないといけないですね。
回答は持っているので、読み込み学習になるはず
次はトレイト + dynでの動的ディスパッチですかね。
花粉症で死にすぎて思うように作業が進まぬ。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?