Solidityで配列を初期化する方法について解説します。
構文
配列には「固定長配列」と「可変長配列(動的配列)」の2つがあります。
それぞれ、以下に構文を記します。
固定長配列
固定長配列とは、その名の通り、“要素数(配列の長さ)が決まっている配列”です。
固定長配列の初期化ですが、以下のどちらでも可能です。
- 配列の宣言と同時に初期化する
- 先に配列の宣言だけを行い、後で初期化する
配列の宣言と同時に初期化する場合
配列の宣言と同時に初期化する場合、構文は以下のようになります。
// 配列の宣言と同時に配列を代入し初期化
// (※固定長なので代入する配列の要素数が宣言した配列変数の要素数を超えないよう注意)
データ型[要素数] アクセス修飾子 変数名 = 配列;
先に配列の宣言だけを行い、後で初期化する場合
先に配列の宣言だけを行い、後で初期化する場合、構文は以下のようになります。
// 先に配列だけを宣言
データ型[要素数] アクセス修飾子 変数名;
// その配列変数に配列を代入し初期化
// (※固定長なので代入する配列の要素数が宣言した配列変数の要素数を超えないよう注意)
配列変数 = 配列;
可変長配列(動的配列)
可変長配列(動的配列)とは、“要素数(配列の長さ)が決まっていない配列”のことです。
可変長配列の初期化ですが、固定長配列と同様、以下の2つのやり方があります。
- 配列の宣言と同時に初期化する
- 先に配列の宣言だけを行い、後で初期化する
また、可変長配列の場合、配列の宣言後、後から固定長配列として初期化することも可能です。
配列の宣言と同時に初期化する場合
配列の宣言と同時に初期化する場合、構文は以下のようになります。
// 配列の宣言と同時に配列を代入し初期化
データ型[] アクセス修飾子 変数名 = 配列;
先に配列の宣言だけを行い、後で初期化する場合
先に配列の宣言だけを行い、後で初期化する場合、構文は以下のようになります。
// 先に配列だけを宣言
データ型[] アクセス修飾子 変数名;
// その配列変数に配列を代入し初期化
配列変数 = 配列;
配列の宣言後、後から固定長配列として初期化する場合
配列の宣言後、後から固定長配列として初期化する場合、構文は以下のようになります。
// 先に配列だけを宣言
データ型[] アクセス修飾子 変数名;
// 固定長配列として初期化
配列変数 = new データ型[](要素数);
サンプルコード
実際のコードを見た方が分かり易いと思いますので、以下にサンプルコードを記します。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
/* 固定長配列 */
// 宣言と同時に初期化
uint[3] public initializedFixedArray = [1, 2, 3];
// まずは宣言だけ(後で初期化する)
uint[3] public fixedArray;
/* 可変長配列(動的配列) */
// 宣言と同時に初期化
uint[] public initializedDynamicArray = [1, 2, 3, 4, 5];
// まずは宣言だけ(後で初期化する)
uint[] public dynamicArray;
// まずは宣言だけ(後で固定長配列として初期化する)
uint[] public dynamicArray2;
constructor() public {
// 初期化(固定長配列)
fixedArray = [1, 2, 3];
// 初期化(可変長配列)
dynamicArray = [1, 2, 3, 4, 5];
// 固定長配列として初期化(可変長配列)
dynamicArray2 = new uint[](3);
}
}
サンプルコードではデータ型はint型で記しましたが、他のデータ型でも方法は同じです。配列は必須の知識なので、固定長配列、可変長配列、どちらも初期化できるようにしておきましょう。