Solidity合约使用var报错ParserError: Expected primary expression求助
错误原因
- 你遇到的
ParserError: Expected primary expression报错核心原因是 Solidity 0.4.20及之后的版本已经完全移除了var关键字,你使用的^0.8.0版本不支持var语法,解析器识别到var时无法匹配合法语法规则,直接抛出异常。 - 额外存在的语法问题:
instructorAccts.push(_address) -1;写法错误,push方法向数组添加元素后返回的是数组最新长度,该写法无意义,属于语法误用。
修复后的完整代码
pragma solidity ^0.8.0; contract Courses { struct Instructor { uint age; string fName; string lName; } mapping (address => Instructor) public instructors; address[] public instructorAccts; function setInstructor(address _address, uint _age, string calldata _fName, string calldata _lName) public { // 显式声明storage引用,直接操作映射中存储的结构体 Instructor storage instructor = instructors[_address]; instructor.age = _age; instructor.fName = _fName; instructor.lName = _lName; // 修正push写法,若需要获取新增元素索引可写成 uint index = instructorAccts.push(_address) - 1; instructorAccts.push(_address); } // 匹配需求的按地址查询讲师信息方法 function getInstructor(address _address) public view returns (Instructor memory) { return instructors[_address]; } // 可选:获取所有讲师地址列表 function getAllInstructors() public view returns (address[] memory) { return instructorAccts; } }
优化说明
- 把
var替换为显式的Instructor storage类型声明,storage关键字表示该变量是存储引用,修改操作会直接更新映射中存储的结构体数据,不会生成临时副本。 - 字符串类型的形参补充了
calldata修饰符,降低不必要的内存拷贝,节省gas消耗。 - 如果追求代码简洁,也可以直接给映射赋值,不需要单独声明引用变量:
instructors[_address] = Instructor({ age: _age, fName: _fName, lName: _lName });
内容的提问来源于stack exchange,提问作者Akhil Kintali
相关产品推荐
相关产品推荐

