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での動的ディスパッチですかね。
花粉症で死にすぎて思うように作業が進まぬ。