Solidity中遍历结构体数组并修改指定结构体成员的问题
Solidity代码错误修正与优化
问题分析与修复点:
字符串比较与赋值符号错误
Solidity中不能直接用==比较string类型,需通过哈希值对比;同时你在if判断里误用了赋值符号=,正确写法是用keccak256(abi.encodePacked())处理字符串后再用==比较。数组越界问题
循环条件i <= customers.length会导致访问数组索引超出范围,应该改为i < customers.length。结构体字段名不匹配
结构体Customers定义的等级字段是level,但代码中误写为ticketLevel,需修正为level。数据一致性问题
原代码维护了nameToTicketLevel映射,但升级等级时未同步更新该映射,会导致数组与映射数据不一致,需补充映射更新逻辑。
修正后的完整代码:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.8; contract LevelUp { struct Customers { string name; uint256 level; } Customers[] public customers; mapping (string => uint256) nameToTicketLevel; function addCustomer(string memory _name, uint256 _ticketLevel) public { customers.push(Customers(_name, _ticketLevel)); nameToTicketLevel[_name] = _ticketLevel; } function levelUp(string memory _name) public { for (uint i = 0; i < customers.length; i++ ){ if (keccak256(abi.encodePacked(customers[i].name)) == keccak256(abi.encodePacked(_name))){ customers[i].level += 1; nameToTicketLevel[_name] += 1; break; // 找到对应客户后跳出循环,避免不必要遍历 } } } }
补充说明:在找到匹配的客户后添加break语句,可减少不必要的循环遍历,节省Gas费用。
内容的提问来源于stack exchange,提问作者LukeS
相关产品推荐
相关产品推荐

