Solidity
讀取狀態變數與記憶體變數。和記憶體與儲存關鍵字
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)我想知道為什麼聲明儲存而不是記憶體
用於從 **映射文章中獲取值$$ $$**我使用了類似於數組切片的切片技術
但是現在在儲存類型中我們使用的是 article.buyer 而不是 article
$$ buyer $$
1)我在網上有這個程式碼
萬一不清楚,你可以在自己的鏈上執行你的合約,或者在像 ganache-cli 甚至 Remix 這樣的模擬器上執行你的合約,這樣開發人員就不會在每次迭代中花錢。
2)我想知道為什麼聲明儲存而不是記憶體
他們的意思不同。
storage
將創建一個指向儲存中值的指針,稱為引用變數。memory
會將值從儲存複製到新的記憶體變數。如果合約正在更新儲存值,那將會產生很大的不同。在這種情況下,不同之處在於這種方式在天然氣上稍微便宜一些。有關差異和警告的更多資訊,請查看此處:https ://vessenes.com/solidity-frustrations-references-and-mapping/
- 但現在在儲存類型中我們使用的是 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;
希望能幫助到你。