You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:15:06