いきなりタイトルが嘘だと懺悔しなければならないのですが、今現在Solidity最新版で動的配列を返す方法はないっぽいです。ただ、それっぽいことは出来るので備忘録がてらここに書いておきます。
正確な定義は分からないのですが、ここで動的配列は要素を追加したり、配列の長さを後から変更できる様な配列とします。
理由は
- 可変長配列はstorageで宣言する必要がある。
- 返り値はmemoryでなければならない。
上記の理由により、動的配列を返すことはできません。
つまり下記の様なコードはエラーが出ます。
sample.sol
// storageは返り値として取れないのでエラー
function sample1() public view returns (uint8[] storage){
uint8[] storage array;
array.push(1);
array.push(2);
return array;
}
// 可変長配列はstorageで宣言しないといけないのでエラー
function sample2() public view returns (uint8[] memory){
uint8[] memory array = [3,4,5];
array.push(6);
return array;
}
ということで長さは別で取得して固定長長さの配列として返します。
sample2.sol
pragma solidity ^0.5.0;
contract sample2{
uint[] array;
// arrayにuintを追加するメソッド
function addComponent(uint _num) public {
array.push(_num);
}
function returnArray() public view returns(uint[] memory){
uint array_length = array.length;
uint[] memory arrayMemory = new uint[](array_length);
arrayMemory = array;
return arrayMemory;
}
}
返り値は固定長のmemoryのuint配列ですが、可変長の配列arrayをこれで取得できました。
もっと簡単な方法があったら教えて下さい。