Solidity构造函数传入string[]报错:Nested arrays not yet implemented求助
解决构造函数传入
string[]时的UnimplementedFeatureError问题 这个错误的核心原因是:你使用的Solidity 0.4.18版本不支持在构造函数中传入string[]这类动态嵌套数组——string本质是动态bytes数组,所以string[]属于嵌套的动态数组,当时的编译器还未实现对这类参数的支持,因此抛出了Nested arrays not yet implemented的报错。
下面给你两种可行的解决方案:
方案1:改用bytes32[]作为构造函数参数
既然你的合约最终是把候选人名称转换成bytes32存储的,直接在构造函数中传入bytes32数组会更高效,也能直接避开编译器的限制。修改后的合约代码如下:
pragma solidity ^0.4.18; contract Voting { // 候选人得票映射 mapping (bytes32 => uint8) public votesReceived; // 候选人列表 bytes32[] public candidateList; // 构造函数改为接收bytes32数组参数 function Voting(bytes32[] candidateNames) public { candidateList = candidateNames; } // 获取指定候选人的总票数 function totalVotesFor(bytes32 candidate) view public returns (uint8) { return votesReceived[candidate]; } // 为指定候选人投票 function voteForCandidate(bytes32 candidate) public { votesReceived[candidate] += 1; } }
部署操作:
在Remix的构造函数参数输入框中,直接输入["alice", "bob"]即可——Remix会自动将字符串转换为对应的bytes32值,无需手动处理十六进制格式。
方案2:拆分候选人添加操作(保留string输入)
如果你坚持要通过string类型添加候选人,可以把构造函数改为空实现,新增一个addCandidate函数来逐个添加候选人,这样就避开了构造函数传入数组的限制。修改后的代码:
pragma solidity ^0.4.18; contract Voting { mapping (bytes32 => uint8) public votesReceived; bytes32[] public candidateList; // 空构造函数 function Voting() public {} // 添加单个候选人 function addCandidate(string candidateName) public { candidateList.push(stringToBytes32(candidateName)); } function totalVotesFor(bytes32 candidate) view public returns (uint8) { return votesReceived[candidate]; } // string转bytes32的工具函数 function stringToBytes32(string memory source) returns (bytes32 result) { bytes memory tempEmptyStringTest = bytes(source); if (tempEmptyStringTest.length == 0) { return 0x0; } assembly { result := mload(add(source, 32)) } } function voteForCandidate(bytes32 candidate) public { votesReceived[candidate] += 1; } }
部署操作:
- 先部署合约(构造函数无需传参);
- 部署完成后,在Remix的函数调用区找到
addCandidate函数,分别传入"alice"和"bob",调用两次完成候选人添加。
两种方案都能解决你遇到的错误,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Az Emna
相关产品推荐
相关产品推荐

