Rustの難しさ
Rustの難しさは、よく所有権システムということだと言われるが、やってみると、所有権で難しくなるようなプログラミングは、他の言語でも難しかったり、いろいろ問題が起きたりするので、難しいのですが、プログラミングが難しいことを要求しているだけで、言語が難しいのではないと思います。
実際プログラミングをしてみると、違うところが難しいなと思いました。
enumが独特な仕様
enumというのは、列挙型ということですが、他の言語では、定数を列挙する形になります。
enum AAAA {
ONE,
TWO,
THREE
}
みたいに、定数を列挙する形になります。
Javaみたいにクラスみたいなこともできたりすることもあるのですが、基本は、定数を選ぶということだけです。
ところが、Rustでは、Enumに構造体のようなものを定義できる。
enum AAA {
ONE(String),
TWO(String,String),
THREE
}
のような形にできる。
構造体の継承ができない
他の言語にあるclassはないです。別に構造体structで似たようなものは作れます。
ただclassのように直接メソッドを定義できず、imp文でメソッドを定義します。
まあ、面倒くさいと言えば面倒なのですが、他の言語のclassの実装は、
同じような形に分解しているはずなので、ハードウエアに近い形であると思います。
しかし、classと違って、継承ができない。traitで、他の言語のinterfaceみたいなことはできるのですが、
特に構造体のメンバを拡張するみたいなことはできません。
なので、継承ではなく、所有という形で構造体を拡張する必要があります。
pub struct Base {
hoge: u8,
}
impl Base {
pub fn new(hoge: u8 ) -> Self {
Self {
hoge,
}
}
}
trait Trait {
fn get_hoge(&self) -> u8;
}
impl Base for Trait {
pub fn get_hoge(&self) -> u8 {
self.hoge
}
}
pub struct Child {
base: Base,
}
impl Child {
pub fn new(hoge: u8) -> Self {
Self {
base: Base::new(hoge)
}
}
}
impl Child for Trait {
pub fn get_hoge(&self) -> u8 {
self.base.get_hoge()
}
}
みたいな感じに書かないといけないです。
継承を使わない形に実装する
無理やり、他の言語の継承のコードをそのまま持ってくると、めちゃくちゃ面倒なことになります。
しかし実は、Rustの場合は、前述のenumを使うと、継承をenumで書き換えて、
他の言語のように実行時にクラスの状態から関数を呼び出すような(仮想関数)コードではなく、
コンパイル時にコードを決定することができます。
継承されたChildをenumに直接定義します。
enum hogehoge {
Base(u8),
Brother(u8),
Sister(u8),
}
そしてmatch文で直接コードを書きます。
必要であれば、Baseと同じコードにし、
特殊処理が必要であれば、別に書き換えます。
match fuga {
hogehoge::Base(piyo) => {
//親
///aaa
}
_ => {
//子
}
}
実際ハードウエア的には、こういうふうに実装した方が、コンパイル時にバグがわかるし、
実際の書き出されたコードも高速なコードを出力します。
要するに、既存コードをRust化するには、頭の中で、高速化をイメージして、
そのイメージをコードに直すと、Rustのコードになると思います。
この辺のコード変換は、結構経験がいりそうな感じで、いろいろ経験が必要かな。