Solidity 0.4.21 までのコンストラクタの書き方
- Solidity 0.4.21 までは、コントラクトと同じ名前の関数がコンストラクタでした。
- ただ、この仕様だと、コントラクト名を変更したときに、コンストラクタだけ変更されずに、意図した初期化処理が行われない可能性がありました。
- なお、Solidity における「コントラクト」は、一般的なプログラミング言語の「クラス」と考えて差し支えないと思います。
例: Piyo という名前のコントラクトの場合
- コンストラクタはコントラクト名 Piyo と同名の関数となります。
pragma solidity 0.4.21;
contract Piyo {
string public message;
// コンストラクタ
function Piyo(string _message) public {
message = _message;
}
}
Solidity 0.4.22 以上でのコンストラクタの書き方
-
constructor
という宣言キーワードを使用した無名関数を使用します。 - 注意:
function constructor(args) {...}
とはせず、constructor (args) {...}
とします。
例: Piyo という名前のコントラクトの場合
- コンストラクタはキーワード
constructor
を使用した無名関数です。
pragma solidity 0.4.22;
contract Piyo {
string public message;
// コンストラクタ
constructor (string _message) public {
message = _message;
}
}
その他の注意点
- Solidity 0.4.22 で導入されたこの仕様は、意図しないバグを防ぐためのものでしたが、Solidity 0.4.22 では 0.4.21 以前の方法でもコンストラクタを書くことができてしまうというバグがあります。
- Solidity 0.4.22 でコンパイルしたコードに、コントラクト名と同名の関数を使用したコンストラクタと、
constructor
キーワードを使用したコンストラクタの両方が存在した場合、どちらか1つのコンストラクタのみが使用されるようです。実験してみたところ、最初に呼ばれたコンストラクタが使用されるようです。 - この問題は Solidity 0.4.23 で修正されているので、特別な理由がない限りは Solidity 0.4.23 以上を使用すべきかと思います。
Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Solidity_0.4.22_以上でのコンストラクタの書き方