Solidity向struct结构体数组push元素报ParserError错误如何解决
错误产生原因
Solidity 合约的全局作用域(合约内、所有函数/代码块之外的区域)仅支持声明类语法:包括状态变量定义、结构体/枚举/事件声明、函数定义,不允许直接编写执行状态修改的逻辑语句。
你代码中的nftArray.push(nftOne);是修改数组状态的执行语句,直接写在了全局作用域下。编译器解析到这一行时,预期读到的是标识符(变量名、函数名等声明类标识),实际却读到了方法调用的左括号(,因此抛出ParserError: Expected identifier but got '('语法错误。
修复方法
按照你需要写入数组元素的时机,选择对应实现即可:
- 如果需要合约部署时就把初始NFT写入数组:将push逻辑放到构造函数中,构造函数会在合约部署时自动执行
- 如果需要合约部署完成后,通过业务操作添加NFT:将push逻辑写到对应的业务函数中,调用函数时才会执行写入操作
修复后的参考代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract NFTDemo { // 存储NFT信息的结构体 struct NFT { string contractAddress; uint256 tokenID; string tokenStandard; string blockChain; uint256 creatorFees; } NFT nftOne = NFT("0xD9D24a4b8A58BCdBfDDd0d27B51F27", 345,"ERC-721", "ETHEREUM", 721); NFT nftTwo = NFT("0xD9824a4b8A5u8CdBfDDd0d27B51F27", 346,"ERC-721", "ETHEREUM", 721); NFT nftThree = NFT("0xD9DE9824a4b8A58BCdBfDDd0Y1F27", 347,"ERC-721", "ETHEREUM", 721); NFT[] public nftArray; // 构造函数:合约部署时自动执行 constructor() { // 部署时就把nftOne存入数组 nftArray.push(nftOne); // 如需部署时存入多个NFT,直接在这里补充push语句即可 } // 业务函数:部署后外部调用可新增NFT到数组 function addNft(NFT memory nft) external { nftArray.push(nft); } }
内容的提问来源于stack exchange,提问作者cthomas4293
相关产品推荐
相关产品推荐

