Solidity

如何處理動態大小的字元串數組?

  • February 13, 2022

我有一個店主,一個店主可以有多個產品。我想將產品 ID 保存在一個數組中。

此外,公共方法可以返回店主的所有產品 id 列表。

我嘗試了以下程式碼

pragma solidity 0.5.0;

contract Shop {

   struct ShopOwner {
       string id;
       string[] productList;
   }

   struct Product {
       string id;
       string name;
   }

   mapping(string => ShopOwner) private mapShopOwner;

   function getUserProductList(string _shopOwnerId) public view returns(string[]) {
       return (mapShopOwner[_shopOwnerId].productList);
   }

}

這似乎不支持solidity語言。

我收到錯誤

browser/Structure.sol:17:33:TypeError:函式中參數的數據位置必須是“記憶體”,但沒有給出。function getUserProductList(string _userId) 公共視圖返回(string

$$ $$) { ^————^

browser/Structure.sol:17:69: TypeError: 函式中返回參數的數據位置必須是“記憶體”,但沒有給出。function getUserProductList(string _userId) 公共視圖返回(string

$$ $$) { ^——^

而且我不想使用pragma experimental ABIEncoderV2;

我想知道,處理這種關係的正確程序是什麼。

Solidity 在目前版本中無法返回字元串數組。一種解決方法是序列化字元串數組,然後在客戶端對其進行反序列化。

一個例子 :

https://hackernoon.com/serializing-string-arrays-in-solidity-db4b6037e520

編譯器抱怨返回類型中缺少數據位置說明符,應該是returns (string [] memory). 此外,作為一個整體返回字元串數組可能是個壞主意,因為可能存在只需要數組長度或只需要某些元素的案例。常見的模式是有兩種方法:一種返回數組長度,另一種按索引返回數組元素。

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