Solidity
無法將計數器變數的值分配給 nft id
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-fix
和pre-fix
運算符,如果你只是聲明計數器變數 likeuint counter;
,並使用它來分配 id likenft.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; }