当前位置: 首页 > news >正文

Solidity——returns和return区别、命名式返回、解构式赋值

这一讲,我们将介绍 Solidity 函数输出,包括:返回多种变量,命名式返回,以及利用解构式赋值读取全部或部分返回值。

返回值:return 和 returns

Solidity 中与函数输出相关的有两个关键字:returnreturns。它们的区别在于:

  • returns:跟在函数名后面,用于声明返回的变量类型及变量名。
  • return:用于函数主体中,返回指定的变量。
// 返回多个变量
function returnMultiple() public pure returns(uint256, bool, uint256[3] memory){return(1, true, [uint256(1),2,5]);
}

在上述代码中,我们利用 returns 关键字声明了有多个返回值的 returnMultiple() 函数,然后我们在函数主体中使用 return(1, true, [uint256(1),2,5]) 确定了返回值。

这里uint256[3]声明了一个长度为3且类型为uint256的数组作为返回值。因为[1,2,3]会默认为uint8(3),因此[uint256(1),2,5]中首个元素必须强转uint256来声明该数组内的元素皆为此类型。数组类型返回值默认必须用memory修饰,在下一个章节会细说变量的存储和作用域。

命名式返回

我们可以在 returns 中标明返回变量的名称。Solidity 会初始化这些变量,并且自动返回这些变量的值,无需使用 return

// 命名式返回
function returnNamed() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){_number = 2;_bool = false;_array = [uint256(3),2,1];
}

在上述代码中,我们用 returns(uint256 _number, bool _bool, uint256[3] memory _array) 声明了返回变量类型以及变量名。这样,在主体中只需为变量 _number_bool_array 赋值,即可自动返回。

当然,你也可以在命名式返回中用 return 来返回变量:

// 命名式返回,依然支持return
function returnNamed2() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){return(1, true, [uint256(1),2,5]);
}

解构式赋值

Solidity 支持使用解构式赋值规则来读取函数的全部或部分返回值。

  •  

    读取所有返回值:声明变量,然后将要赋值的变量用,隔开,按顺序排列。

    uint256 _number;
    bool _bool;
    uint256[3] memory _array;
    (_number, _bool, _array) = returnNamed();
  •  

    读取部分返回值:声明要读取的返回值对应的变量,不读取的留空。在下面的代码中,我们只读取_bool,而不读取返回的_number_array

    (, _bool2, ) = returnNamed();

在 Remix 上运行

  •  

    部署合约后查看三种返回方式的结果

总结

这一讲,我们介绍 Solidity 函数返回值,包括:返回多种变量,命名式返回,以及利用解构式赋值读取全部或部分返回值。这些知识点有助于我们在编写智能合约时,更灵活地处理函数返回值。

http://www.lryc.cn/news/581719.html

相关文章:

  • 【代码问题】【模型下载】从 HuggingFace 上下载模型
  • 2、Connecting to Kafka
  • 大模型关键字解释
  • 【机器学习笔记Ⅰ】4 梯度下降
  • 【管理学】乐嘉性格色彩与MBTI的优劣和适用场景
  • 【C++基础】内存管理四重奏:malloc/free vs new/delete - 面试高频考点与真题解析
  • 汇编与接口技术:8259中断实验
  • 高效处理大体积Excel文件的Java技术方案解析
  • 从0写自己的操作系统(4)实现简单的任务切换
  • FileZilla二次开发实战指南:C++架构解析与界面功能扩展
  • 在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控
  • 【机器学习笔记Ⅰ】13 正则化代价函数
  • [2025CVPR]一种新颖的视觉与记忆双适配器(Visual and Memory Dual Adapter, VMDA)
  • SSL 终结(SSL Termination)深度解析:从原理到实践的全维度指南
  • Python Bcrypt详解:从原理到实战的安全密码存储方案
  • 用户中心Vue3项目开发2.0
  • 2048小游戏实现
  • 线性代数--AI数学基础复习
  • 深度学习6(多分类+交叉熵损失原理+手写数字识别案例TensorFlow)
  • Chunking-free RAG
  • Web-API-day2 间歇函数setInterval与事件监听addEvenListener
  • 【Note】《Kafka: The Definitive Guide》第四章:Kafka 消费者全面解析:如何从 Kafka 高效读取消息
  • Apache Spark 4.0:将大数据分析提升到新的水平
  • A O P
  • 金融级B端页面风控设计:操作留痕与异常预警的可视化方案
  • 深度学习篇---深度学习常见的应用场景
  • 容声W60以光水离子科技实现食材“主动养鲜”
  • [Qt] visual studio code 安装 Qt插件
  • FastAPI + Tortoise-ORM + Aerich 实现数据库迁移管理(MySQL 实践)
  • 深度学习 必然用到的 线性代数知识