Solidity中使用console.log打印结构体数组报错,求解决方法
解决Solidity中console.log无法打印自定义结构体/结构体数组的问题
Solidity内置的console库(Hardhat/Truffle提供)没有提供直接打印自定义结构体或结构体数组的重载方法,所以直接传结构体实例会报找不到log方法的错误。要实现你要的打印格式,得手动遍历结构体的所有字段,嵌套打印内部数组。
1. 编写辅助打印函数
先写专门打印Track和Musician结构体的辅助函数,复用代码:
// 打印单个Track结构体 function printTrack(Track memory track) internal view { console.log(" {title: '%s', duration: %d}", track.title, track.duration); } // 打印单个Musician结构体 function printMusician(Musician memory musician) internal view { console.log("{name: '%s', tracks: [", musician.name); // 遍历tracks数组逐个打印 for (uint j = 0; j < musician.tracks.length; j++) { printTrack(musician.tracks[j]); // 最后一个元素不加逗号 if (j < musician.tracks.length - 1) { console.log(","); } } console.log("]}"); }
2. 修改getAllMusicians函数调用辅助方法
替换原来报错的打印逻辑,调用辅助函数输出目标格式:
function getAllMusicians() public view returns (Musician[] memory){ Musician[] memory musicianList = new Musician[](addressMusicianNumber); console.log("["); for (uint i = 0; i < addressMusicianNumber; i++) { musicianList[i] = Musicians[addressMusician[i]]; // 打印单个Musician实例 printMusician(musicianList[i]); // 数组元素间添加逗号(最后一个元素除外) if (i < addressMusicianNumber - 1) { console.log(","); } } console.log("]"); return musicianList; }
输出效果
运行后控制台会输出你需要的格式:
[ {name: 'musician1', tracks: [ {title: 'name1', duration: 340}, {title: 'name2', duration: 30} ]} , {name: 'musician2', tracks: [ {title: 'name3', duration: 34}, {title: 'name4', duration: 31} ]} ]
补充说明
- 若你使用Solidity ^0.8.20+ 且Hardhat版本≥v2.19,可尝试
console.logStruct()直接打印结构体,比如console.logStruct(musicianList[i]),但它的输出是分行的键值对格式,不是紧凑JSON;如果需要严格匹配你要的格式,还是用手动拼接的方式更合适。
内容的提问来源于stack exchange,提问作者DamTan
相关产品推荐
相关产品推荐

