Arrays
數組和映射沒有指向同一個結構
我正在建構 DApp 遊戲,但遇到了問題。讓我描述一下。我有一個結構:
struct NPC { uint id; string name; uint level; }
然後我有一個儲存所有 NPC 的數組:
NPC[] public NPCs;
並將地圖從城市映射到 NPC:
mapping (uint => NPC[]) public cityNPCs;
當我創建新的 NPC 時,我將它推送到數組和映射:
function createNpc(string memory _name, uint _level, uint _cityId) public returns (bool success) { uint newId = NPCs.length; NPC memory newNpc = NPC(newId, _name, _level); NPCs.push(newNpc); cityNPCs[_cityId].push(NPCs[newId]); return true; }
問題是當 NPC 結構在數組中更新時,更新不會反映在映射中,反之亦然。那麼,有沒有辦法通過使數組和映射元素同步來解決這個問題?
順便說一句,Solidity 版本:
pragma solidity >=0.5.0; pragma experimental ABIEncoderV2;
由於每個對象顯然是複製的(即數組中的一個對象和映射中的另一個對象),您可以將對象添加到數組中,然後將其在數組中的索引添加到映射中。
換句話說,而不是這樣做:
mapping (uint => NPC[]) public cityNPCs; ... NPCs.push(newNpc); cityNPCs[_cityId].push(NPCs[newId]);
你可以這樣做:
mapping (uint => uint[]) public cityNPCs; ... NPCs.push(newNpc); cityNPCs[_cityId].push(NPCs.length - 1);
然後分別更改其餘程式碼。