You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity中是否必须编写return语句?合约代码相关疑问

Solidity合约中return语句的作用与你的疑问解答

你的合约代码

pragma solidity ^0.8.0;

contract Counter {
    uint public number;
    string public name;

    constructor(string memory input_name, uint input_number){
        name = input_name;
        number = input_number;
    }

    function add () public {
        number ++;
    }

    function subtract() public {
        number --;
    }

    function update_name(string memory update) public {
        name = update;
    }
}

你的问题

我编写了上述基础Solidity合约,疑惑为何要为每个函数编写return语句——毕竟合约中的public变量已自动生成getter返回值。恳请专业人士解释我的认知误区,或是说明此处return语句的作用。

解答

你的认知完全没问题——你合约里的add、subtract、update_name这类状态修改函数,根本不需要写return语句,原因很直接:

  1. 这类函数的核心职责是修改合约的存储状态,执行结果会直接体现在链上的变量值里。调用者要获取最新状态,直接用public变量自动生成的getter函数就行,完全不需要函数本身返回什么。

  2. 自动生成的getter函数是专门用来读取状态的,和修改函数的职责完全分开:

    • getter是view类型(默认),只读取不修改,几乎不消耗gas;
    • 你的修改函数属于non-payable(默认)的状态变更函数,执行会消耗gas。就算给这类函数加了return语句,返回值也只有**本地调用(比如Remix里的直接调用)**能拿到,链上不会记录这个返回值,其他合约或者外部调用者根本没法通过链上数据获取这个返回值(如果需要通知外部状态变化,正确的做法是用事件event)。

那什么时候需要写return语句?

  • 当你写自定义的读取类函数(view/pure类型)时,需要返回计算结果,比如:
    function getDoubleNumber() public view returns(uint) {
        return number * 2;
    }
    
    这类函数不修改状态,只是基于现有数据做计算,必须通过return把结果返回给调用者。
  • 如果你只是在本地调试状态修改函数,想即时拿到一些临时计算值,也可以加return,但注意这个值不会上链,没有链上意义。

总结:你当前的合约完全不需要给那三个修改函数加return语句,它们的作用就是改状态,状态查询已经由getter函数覆盖了,多此一举。

内容的提问来源于stack exchange,提问作者Arcane Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:05:29