Solidity

讀取狀態變數與記憶體變數。和記憶體與儲存關鍵字

  • October 16, 2018
contract Shopping {

   struct Article {
       uint id; 
       address seller;
       address buyer;
       string name;
       string description;
       uint256 price;
   }

   // state variable 
   mapping(uint256 => Article) public articles; 
   uint articleCounter;

   function buyArticle(uint _id ) public payable {
       Article  storage article = articles[_id];
       require( article.buyer == 0x0);                                      
       require(msg.sender != article .seller]);
   }
}

1)我在網上有這個程式碼

2)我想知道為什麼聲明儲存而不是記憶體

  1. 用於從 **映射文章中獲取值$$ $$**我使用了類似於數組切片的切片技術

  2. 但是現在在儲存類型中我們使用的是 article.buyer 而不是 article

$$ buyer $$

1)我在網上有這個程式碼

萬一不清楚,你可以在自己的鏈上執行你的合約,或者在像 ganache-cli 甚至 Remix 這樣的模擬器上執行你的合約,這樣開發人員就不會在每次迭代中花錢。

2)我想知道為什麼聲明儲存而不是記憶體

他們的意思不同。storage將創建一個指向儲存中值的指針,稱為引用變數。memory會將值從儲存複製到新的記憶體變數。如果合約正在更新儲存值,那將會產生很大的不同。在這種情況下,不同之處在於這種方式在天然氣上稍微便宜一些。

有關差異和警告的更多資訊,請查看此處:https ://vessenes.com/solidity-frustrations-references-and-mapping/

  1. 但現在在儲存類型中我們使用的是 article.buyer 而不是 article

$$ buyer $$

儲存和記憶體類型不會更改此語法。

您使用mapping(uint256 => Article) public articles;which 意味著struct每個索引處都有一個。struct包含成員。所以,你可以說

Article storage myArticle = articles[myArticleId]
string n = myArticle.name;

或者你可以說

string n = articles[myArticleId].name;

希望能幫助到你。

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