Solidity

無法將計數器變數的值分配給 nft id

  • April 1, 2022
function _mint(string memory _name, bool _isOnSale, uint _price) public{
   MyNft storage nft = fetchNft[_name];
   require(!nft.exists, "The Nft already Exists");        
   uint counter;
   nft.id += counter++;
   nft.name = _name;
   nft.isOnSale = _isOnSale;
   nft.owner = msg.sender;
   nft.price = _price * 1 ether;
   nft.exists = true;
   counter = nft.id;

}

在上面的函式中,我試圖將 counter 變數的值賦給 nft.id,但是賦給 nft.id 的值始終保持為 0,無論我執行多少次 mint 函式。

請幫助我了解此問題背後的原因以及我該如何解決。

counter變數是在_mint(string memory _name, bool _isOnSale, uint _price)函式本身內部聲明的,因此每次呼叫該函式時,它都會被聲明為 new 並包含預設值0. 您需要在函式外部聲明它以跟踪鑄造的 NFT 數量。

nft.id += counter++;另外,我想知道您為什麼要像我的意思那樣分配ID ,為什麼+=在分配時使用?

如果 NFT 是新的,如果流量到達那條線,總是這樣,nft.id一定是0,所以使用+=與僅使用沒有區別=

關於使用post-fixpre-fix運算符,如果你只是聲明計數器變數 like uint counter;,並使用它來分配 id like nft.id = counter++;,對於第一個 NFT,它會將 id 分配為0。原因是,post-fix首先將值分配給變數,然後增加已使用的變數的值。

您可以使用初始值 1 ( uint counter = 1;) 聲明計數器變數,也可以pre-fix在分配值時使用,例如nft.id = ++counter;. 因為pre-fix運算符首先遞增變數的值,然後將其儲存到分配給它的變數中。

我還沒有測試過,但你更新的程式碼可能看起來像這樣-

uint counter;

function _mint(string memory _name, bool _isOnSale, uint _price) public{
   MyNft storage nft = fetchNft[_name];
   require(!nft.exists, "The Nft already Exists");        
   nft.id = ++counter;
   nft.name = _name;
   nft.isOnSale = _isOnSale;
   nft.owner = msg.sender;
   nft.price = _price * 1 ether;
   nft.exists = true;
}

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