W.I.S. Laboratory
menu-bar

Rust


Rustでコンストラクタ

Rustは仕様上コンストラクタを持っていない。
なぜかと言うと、「明確であること」が設計思想の根幹にあるからだ。
コード上はインスタンスを生成するという命令一つしか書いていないのに、それを見ただけでは予想できない動きがあるというのは「明確ではない」ということなんだと思う。
そうはいっても普段C++などを書いてる人間にとっては欲しくなるときがある。
それにインスタンス生成のたびに全フィールドの初期化コードをその場にズラズラ書きたくないわけで・・私が古い人間なんだろうけども。
Go言語だとインスタンスを生成していない構造体内の関数を呼び出すことができないので、慣例的に「New」+「構造体名」という普通の関数を作ってその関数内でインスタンスを生成し、そのポインタを返すという力技でコンストラクタ代わりにするんだけど、Rustの場合はインスタンスを生成しなくても構造体内のメソッドを呼び出せるので少しキレイに書ける。
とはいっても、ここでインプリメンテーションしているnew()はコンストラクタではなく、ただそういう名前を付けた関数であり、この関数内でインスタンスを生成しているに過ぎない。
この関数名は別に「hoge()」でも「piyo()」でも問題ないが、「new()」という関数名になったのはRust自身がそういう名前を使っているので皆がそれに倣ったからだろうと思う。
「new」というとヒープ上に生成されるようなイメージだが、RustはBox化しない限りスタックに置かれる。

フィールドの値を変更したいときは new() からポインタを受け取る変数だけに mut を付ければ良い。(new() 関数が構造体へのポインタを返した時点で所有権が移動するので)

スタックではなく、ヒープにインスタンスを生成したい時はBox化すれば可能。


[ 戻る ]
saluteweb