こんにちは、エンジニアのオオバです。
Solidityを学習中、ここ数年で仕様が変わっている模様。
バージョン毎のSolidityコンストラクタ仕様を調査しました。
結論
- v0.4.21まではContract名がコンストラクタ
- v0.4.22以降はconstructorキーワードでコンストラクタをサポート
- v0.6.12まではconstructorキーワードに対してpublic属性は必須
- v0.7.0以降はコンストラクタにpublicは不要(v0.8.4も同様)
→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら
もくじ
v0.4.21まではContract名がコンストラクタ
pragma solidity >=0.4.0 <=0.8.4;
contract HelloWorld
{
uint public storedData;
function HelloWorld (uint value) public {
storedData = value;
}
}
v0.4.22以降はconstructorキーワードでコンストラクタをサポート
v0.4.22以降は👇 constructor
キーワードを使った無名関数でコンストラクタを定義します。
pragma solidity >=0.4.0 <=0.8.4;
contract HelloWorld
{
uint public storedData;
constructor (uint value) public {
storedData = value;
}
}
またv0.6.12まではコンストラクタにはpublic
が必須です。
publicを外すと以下の警告👇。
Warning: No visibility specified. Defaulting to "public". constructor (uint value) { ^ (Relevant source part starts here and spans across multiple lines).
Contract名のメソッドを定義すると警告
Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead. function HelloWorld (uint value) public { ^ (Relevant source part starts here and spans across multiple lines).
👆のようにv0.4.22以降ではContract名のメソッドは定義できません。
v0.7.0以降はコンストラクタにpublicは不要
v0.7.0以降は👇以下のようにpublicを削除した形が正しいです。
pragma solidity >=0.4.0 <=0.8.4;
contract HelloWorld
{
uint public storedData;
constructor (uint value) {
storedData = value;
}
}
とりあえず、最新のv0.8.4にしても正常にコンパイルは通りました。
この記事が気に入ったらフォローしよう
オススメ記事
検証環境
- Solidiy v0.4.21 - v0.8.4