Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@_akira19

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

More than 1 year has passed since last update.

いきなりタイトルが嘘だと懺悔しなければならないのですが、今現在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をこれで取得できました。

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

3
Help us understand the problem. What is going on with this article?
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
_akira19
Twitter: @_akira19
bajji
2019年創業のスタートアップ 。感情日記SNS『Feelyou(フィールユー)』、ブロックチェーンを活用したSNS『bajji(バッジ)』を開発しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?