【Solidity】マッピングの長さを取得するには?

Solidityでマッピングの長さを取得する方法について解説します。

結論:マッピングの長さを取得できるメソッドはない

出鼻を挫くようで申し訳ないですが、Solidityのマッピング(mapping)には、lengthなど長さを取得するメソッドが備わっていません。

そのため、長さを保存する専用の変数を用意するなど、代替策をとる必要があります。

代替策:長さを管理する変数を用意

以下は、マッピングの長さを管理する変数を用意した、サンプルコードです。

マッピングへの要素追加のたびにインクリメント(数をプラス1)、要素削除のたびにデクリメント(数をマイナス1)しています。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
 
contract TestContract {

    mapping (address => string) public users;
    uint userNum = 0; // usersマッピングの長さを管理する変数

    function addUser(string memory _userName) public {
        users[msg.sender] = _userName;
        userNum++; // 要素追加のたびにインクリメント
    }

    function delUser(address _userAccount) public {
        users[_userAccount];
        userNum--; // 要素削除のたびにデクリメント
    }

    // usersマッピングの要素数を取得
    function getUserNum() public view returns(uint) {
        return userNum;
    }

}

Solidityはブロックチェーン開発言語のため、他のプログラミング言語に比べ、使えるメソッドが限られています。そのため、メソッドにない操作については、独自処理を実装するか外部ライブラリに頼るようにしましょう。

タイトルとURLをコピーしました