Help us understand the problem. What is going on with this article?

Solidityで動的配列(可変長配列)を返す方法

いきなりタイトルが嘘だと懺悔しなければならないのですが、今現在Solidity最新版で動的配列を返す方法はないっぽいです。ただ、それっぽいことは出来るので備忘録がてらここに書いておきます。
正確な定義は分からないのですが、ここで動的配列は要素を追加したり、配列の長さを後から変更できる様な配列とします。

理由は
1. 可変長配列はstorageで宣言する必要がある。
2. 返り値は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をこれで取得できました。

もっと簡単な方法があったら教えて下さい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away