Solidity
在solidity中映射的預設getter和setter
在我的智能合約中,我有一個公共映射,
mapping (uint=>User) public users
即 whereUser
is aStruct
. 有沒有辦法使用預設的 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)
以獲取某個索引處的映射結構。它會返回a
andb
但不會active
orkeys
。*避免令人頭疼的問題:*如果沒有至少一個標量值(即
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 */)