Remix中Solidity数组修改后,同函数无返回值的技术疑问
Solidity函数修改数组后无法返回值的问题分析
测试合约代码
// SPDX-License-Identifier: Unlicensed pragma solidity >= 0.7.0; contract Basic{ uint[] public val = [1,2]; function demo() public returns(uint) { val[0] = 22; return val[0]; } function d2() public view returns(uint){ return val[0]; } }
问题场景
在Remix平台测试时发现:
- demo函数未添加
val[0] = 22赋值语句时,能正常返回结果 - 添加赋值修改数组后,demo函数不再显示返回值
疑问:Solidity中修改数组后,是否无法在同一函数中查看返回值?
问题解答
Solidity本身完全允许在修改状态变量(比如这里的数组)后,在同一函数中返回值,你遇到的问题是Remix的交互逻辑导致的,和语言特性无关:
交易与调用的区别
- 当函数修改了状态变量(如demo里修改val数组),这个函数会触发区块链交易,交易是异步上链的,Remix默认只会返回交易哈希,不会直接展示函数的return值——因为交易需要等待节点打包确认,无法实时返回执行结果
- 如果函数没有修改状态,即使没加
view修饰符,Remix也会以"调用(call)"的方式执行,这是只读操作,能直接返回函数的返回值
验证修改与返回值的方法
- 调用demo函数后,再调用
d2(),会看到val[0]已经被修改为22,说明demo的执行是成功的 - 若要查看demo函数的返回值,可使用Remix的Debug功能:执行demo后,点击交易记录中的"Debug"按钮,逐步执行代码到return语句,就能看到返回的22
- 若只是验证返回逻辑,可临时给demo加上
view修饰(但此时无法修改状态,仅做测试用)
- 调用demo函数后,再调用
内容的提问来源于stack exchange,提问作者Md Arif Khan
相关产品推荐
相关产品推荐

