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