Arrays

數組和映射沒有指向同一個結構

  • February 25, 2020

我正在建構 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);

然後分別更改其餘程式碼。

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