Solidity

在solidity中映射的預設getter和setter

  • July 8, 2021

在我的智能合約中,我有一個公共映射,mapping (uint=>User) public users即 where Useris a Struct. 有沒有辦法使用預設的 getter 來獲取這個映射的值?

例如:如果我們有public uint count,我們可以簡單地通過使用來呼叫它Object.count。映射也可以嗎?

請幫忙!

你得到一個帶有索引參數的函式。它返回結構中的標量值,因此所有本身不是映射或數組的東西。

例如:

pragma solidity 0.5.1;

contract StuctsGetter {

   struct MyStruct {
       uint a;
       bytes32 b;
       mapping(address => bool) active;
       bytes32[] keys;
   }

   mapping(uint => MyStruct) public myStructs;

   function setMyStruct(uint index, uint a, bytes32 b) public {
       MyStruct storage m = myStructs[index];
       m.a = a;
       m.b = b;
   }

}

您可以呼叫instance.myStructs(uint)以獲取某個索引處的映射結構。它會返回aandb但不會activeor keys

*避免令人頭疼的問題:*如果沒有至少一個標量值(即struct完全由映射和/或數組組成),那麼編譯器將不知道如何構造“自由”getter。它會以令人困惑的方式失敗。

要設置/獲取映射結構中的索引值,請編寫您自己的函式。

function appendKeyToMyStruct(uint _myStruct, address key) public ... {
 myStructs[_myStruct].keys.push(key);
}

function getMyStructKey(uint _myStruct, uint row) public ... {
 return myStructs[_myStruct].keys[row];
}

這些模式可能會給你一些想法:Solidity 有沒有很好解決且簡單的儲存模式?

關於範例中使用的儲存指針的一些資訊:https ://blog.b9lab.com/storage-pointers-in-solidity-7dcfaa536089

希望能幫助到你。

首先,沒有預設設置器(在您的問題標題中提到)。

現在關於預設吸氣劑。 Solidity 文件給出了以下範例:

struct Data {
   uint a;
   bytes3 b;
   mapping (uint => uint) map;
}
mapping (uint => mapping(bool => Data[])) public data;

將生成以下吸氣劑:

function data(uint arg1, bool arg2, uint arg3) public returns (uint a, bytes3 b) {
   a = data[arg1][arg2][arg3].a;
   b = data[arg1][arg2][arg3].b;
}

因此,預設 getter 不返回結構,而是返回所有原子結構欄位的元組。

在您的情況下,getter 將如下所示:

function users (uint id) public returns (/* all atomic fields of User structure */)

引用自:https://ethereum.stackexchange.com/questions/67832