Solidity:如何实现修改状态变量同时返回结果并在Remix中显示?
问题描述
我初始化了一个votes数组和两个用于存储投票的函数,代码如下:
uint[2] votes = [0,0]; function vote_a() public{ votes[0] += 1; } function vote_b() public{ votes[1] += 1; }
随后我编写了一个results函数,该函数需要根据票数返回"tie"、"a wins"或"b wins",同时将票数重置为0,代码如下:
function results() public returns(string memory){ uint a = votes[0]; uint b = votes[1]; votes[0]=0; votes[1]=0; if (a==b) return "tie"; else if (a>b) return "a wins"; else return "b wins"; }
但该函数无法像view函数那样在Remix IDE中显示返回结果,且由于需要修改votes数组元素的值,我不能将函数标记为view。请问有没有办法同时实现这两个需求?
解决方案
有两种实用方式可以同时实现返回结果预览和重置票数的需求:
方法一:拆分查询与状态修改逻辑
- 新增一个
view函数专门用于查询当前投票结果,无需修改状态,在Remix中可直接预览返回值:
function getCurrentResult() public view returns(string memory){ uint a = votes[0]; uint b = votes[1]; if (a == b) return "tie"; else if (a > b) return "a wins"; else return "b wins"; }
- 保留原
results函数负责重置票数,执行后可通过调用getCurrentResult确认状态已重置,或查看交易记录验证状态变化。
方法二:通过事件传递结果
在合约中定义事件,在results函数执行时触发事件并携带结果信息,调用后可在Remix的交易日志中查看结果:
event ResultAnnounced(string result); function results() public{ uint a = votes[0]; uint b = votes[1]; votes[0] = 0; votes[1] = 0; string memory res; if (a == b) res = "tie"; else if (a > b) res = "a wins"; else res = "b wins"; emit ResultAnnounced(res); }
调用results后,在Remix的控制台或交易详情的"Events"板块就能看到ResultAnnounced事件输出的结果,同时票数会被成功重置。
核心原因说明
Remix中view/pure函数能直接返回结果是因为它们仅本地读取链上状态,无需发送交易;而修改状态的函数必须发起交易,区块链交易本身不会即时返回结果(需共识确认),因此只能通过事件或后续查询获取结果。
内容的提问来源于stack exchange,提问作者TTN18
相关产品推荐
相关产品推荐

