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

以太坊开发学习-solidity(三)函数类型

目录

函数类型


函数类型

solidity官方文档里把函数归到数值类型

函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量, 也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。

函数类型有两类:- 内部(internal) 函数和 外部(external) 函数:

1. 内部函数只能在当前合约内被调用(更具体来说, 在当前代码块内,包括内部库函数和继承的函数中), 因为它们不能在当前合约上下文的外部被执行。 调用一个内部函数是通过跳转到它的入口标签来实现的, 就像在当前合约的内部调用一个函数。

2.外部函数由一个地址和一个函数签名组成,可以通过外部函数调用传递或者返回

函数形式

    function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]

看着些复杂,咱们从前往后一个一个看(方括号中的是可写可不写的关键字):

  1. function:声明函数时的固定用法,想写函数,就要以function关键字开头。

  2. <function name>:函数名。

  3. (<parameter types>):圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。

  4. {internal|external|public|private}:函数可见性说明符,一共4种。没标明函数类型的,默认public。合约之外的函数,即"自由函数",始终具有隐含internal可见性。

    • public: 内部外部均可见。
    • private: 只能从本合约内部访问,继承的合约也不能用。
    • external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名)。
    • internal: 只能从合约内部访问,继承的合约可以用。

    Note 1: 没有标明可见性类型的函数,默认为public

    Note 2public|private|internal 也可用于修饰状态变量。 public变量会自动生成同名的getter函数,用于查询数值。

    Note 3: 没有标明可见性类型的状态变量,默认为internal

  5. [pure|view|payable]:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETHpureview的介绍见下一节。

  6. [returns ()]:函数返回的变量类型和名称。

 使用内部函数类型的例子

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;library ArrayUtils {// 内部函数可以在内部库函数中使用,因为它们将是同一代码上下文的一部分function map(uint[] memory self, function (uint) pure returns (uint) f)internalpurereturns (uint[] memory r){r = new uint[](self.length);for (uint i = 0; i < self.length; i++) {r[i] = f(self[i]);}}function reduce(uint[] memory self,function (uint, uint) pure returns (uint) f)internalpurereturns (uint r){r = self[0];for (uint i = 1; i < self.length; i++) {r = f(r, self[i]);}}function range(uint length) internal pure returns (uint[] memory r) {r = new uint[](length);for (uint i = 0; i < r.length; i++) {r[i] = i;}}
}contract Pyramid {using ArrayUtils for *;function pyramid(uint l) public pure returns (uint) {return ArrayUtils.range(l).map(square).reduce(sum);}function square(uint x) internal pure returns (uint) {return x * x;}function sum(uint x, uint y) internal pure returns (uint) {return x + y;}
}

使用外部函数类型的例子

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;contract Oracle {struct Request {bytes data;function(uint) external callback;}Request[] private requests;event NewRequest(uint);function query(bytes memory data, function(uint) external callback) public {requests.push(Request(data, callback));emit NewRequest(requests.length - 1);}function reply(uint requestID, uint response) public {// 这里要检查的是调用返回是否来自可信的来源requests[requestID].callback(response);}
}contract OracleUser {Oracle constant private ORACLE_CONST = Oracle(address(0x00000000219ab540356cBB839Cbe05303d7705Fa)); // 已知的合约uint private exchangeRate;function buySomething() public {ORACLE_CONST.query("USD", this.oracleResponse);}function oracleResponse(uint response) public {require(msg.sender == address(ORACLE_CONST),"Only oracle can call this.");exchangeRate = response;}
}

返回值 return 和 returns ​

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

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

上面这段代码中,我们声明了returnMultiple()函数将有多个输出:returns(uint256, bool, uint256[3] memory),接着我们在函数主体中用return(1, true, [uint256(1),2,5])确定了返回值。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;// 返回多个变量
// 命名式返回
// 解构赋值contract Return {// 返回多个变量function returnMultiple() public pure returns(uint256, bool, uint256[3] memory){return(1, true, [uint256(1),2,5]);}// 命名式返回function returnNamed() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){_number = 2;_bool = false; _array = [uint256(3),2,1];}// 命名式返回,依然支持returnfunction returnNamed2() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){return(1, true, [uint256(1),2,5]);}// 读取返回值,解构式赋值function readReturn() public pure{// 读取全部返回值uint256 _number;bool _bool;bool _bool2;uint256[3] memory _array;(_number, _bool, _array) = returnNamed();// 读取部分返回值,解构式赋值(, _bool2, ) = returnNamed();}
}

相关文章:

以太坊开发学习-solidity(三)函数类型

目录 函数类型 函数类型 solidity官方文档里把函数归到数值类型 函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量&#xff0c; 也可以将一个函数作为参数进行传递&#xff0c;还能在函数调用中返回函数类型变量。 函数类型有两类&#xff1a;- 内部&…...

教你把公司吃干抹净、榨干带走

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答 正文 打工人一定要做到够自私&#xff0c;把公司的一切为我所用&#xff0c;你要知道闷头打工是没有出路的。聪明的人会以最快的速度榨干带走公司的一切资源、人脉、技能&#xff0c;为…...

开发指南007-导出Excel

平台上开发导出Excel比过去的单体架构要复杂些&#xff0c;因为前端和后台不在一个进程空间里。 后台的操作是先生成excel文件&#xff0c;技术路线是jxl <dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId&g…...

滑块验证码

1.这里针对滑块验证给了一个封装的组件verifition&#xff0c;使用直接可以调用 2.组件目录 3.每个文件的内容 3.1 Api文件中只有一个index.js文件&#xff0c;用来存放获取滑块和校验滑块结果的api import request from /router/axios//获取验证图片 export function reqGe…...

cmd常用指令

cmd全称Command Prompt&#xff0c;中文译为命令提示符。 命令提示符是在操作系统中&#xff0c;提示进行命令输入的一种工作提示符。 在不同的操作系统环境下&#xff0c;命令提示符各不相同。 在windows环境下&#xff0c;命令行程序为cmd.exe&#xff0c;是一个32位的命令…...

【嵌入式DIY实例】-DIY手势识别和颜色识别(基于APDS9960)

DIY手势识别和颜色识别(基于APDS9960) 文章目录 DIY手势识别和颜色识别(基于APDS9960)1、硬件准备2、APDS9960 手势识别传感器介绍3、硬件接线4、代码实现4.1 手势识别4.2 颜色识别4.3 趋近感应代码5、综合实例代码在本文中,我们将介绍 APDS9960 手势、RGB 和接近传感器与…...

python 直方图

python可以调用hist方法绘制直方图。 import matplotlib.pyplot as plt import numpy as np; plt.rcParams["font.family"]["SimHei"] # 确保图中中文字体正确显示 x[0.1,0.2,0.3,0.4,0.5,0.6,0.1,0.2,0.2,0.2] plt.xlabel(满意程度) plt.ylabel(频数) …...

如何在数据库中使用sql语言插入数据

在SQL中&#xff0c;你可以使用INSERT INTO语句来添加数据到数据库表中。以下是一个基本示例&#xff0c;说明如何向表中插入数据&#xff1a; 假设你有一个名为students的表&#xff0c;它有以下字段&#xff1a;id, name, age 和 grade。 CREATE TABLE students ( id INT P…...

JVM的双亲委派模型和垃圾回收机制

jvm的作用是解释执行java字节码.java的跨平台就是靠jvm实现的.下面看看一个java程序的执行流程. 1. jvm中的内存区域划分 jvm也是一个进程,进程在运行过程中,要行操作系统申请一些资源.这些内存空间就支撑了后续java程序的执行. jvm从系统申请了一大块内存,这块内存在java程序使…...

ThreadLocal-内存泄露问题

ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时实现了线程内的资源共享案例&#xff1a;使用JDBC操作数据库时&#xff0c;会将每一个线程的Conn…...

ISIS默认层级实验简述

ISIS被划分为三个层级&#xff1a;Level 1、Level 2和Level 1-2。 默认情况下&#xff0c;ISIS路由器属于level 1-2,是指同时支持Level 1和Level 2的路由器。路由器既可以在同一个自治系统内部进行路由选择&#xff0c;也可以将路由信息传递到其他自治系统。 实验拓扑图&#…...

在Flutter中创建自定义的左对齐TabBar组件

在Flutter应用程序中&#xff0c;TabBar是一种常见的UI模式&#xff0c;用于在不同的标签页之间进行导航。然而&#xff0c;默认情况下&#xff0c;Flutter的TabBar在水平方向上是居中对齐的。本文将介绍如何创建一个自定义的左对齐TabBar组件&#xff0c;以满足特定的布局需求…...

【Python】继承会遇到的问题

单继承和多继承在python中的区别和应用场景 单继承指的是一个子类只继承自一个父类。这简化了继承关系&#xff0c;使得代码易于理解和维护。大多数情况下&#xff0c;单继承足以处理常见的场景&#xff0c;如扩展基类的功能或者覆盖某些方法。多重继承允许在一个类同时继承多个…...

相机模型Omnidirectional Camera(全方位摄像机)

1. 背景 大多数商用相机都可以描述为针孔相机&#xff0c;通过透视投影进行建模。然而&#xff0c;有些投影系统的几何结构无法使用传统针孔模型来描述&#xff0c;因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D…...

论文阅读——Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation image-text contrastive learning(ITC)用在单模态&#xff0c;masked language modeling (MLM) and image-text matching (ITM) 用在多模态。 单模态编码器的表示上引入了中间图像…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Rating)

提供在给定范围内选择评分的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rating(options?: { rating: number, indicator?: boolean }) 从API version 9开始&#…...

Unity中的网格创建和曲线变形

Unity中的网格创建和曲线变形 3D贝塞尔曲线变形贝塞尔曲线基础线性公式二次方公式三次方公式 Unity 实现3D贝塞尔曲线变形准备工作脚本概述变量定义 变量解析函数解析 获取所有子节点GetAllChildren 获取所有子节点UpdateBezierBend 控制点更新CalculateBezier Bezier 曲线公式…...

day0 3r文档docker部署

3R编码 | 3R教室 - 最好的数字游民学习与交流俱乐部! (3rcd.com) window安装wsl下载不下来&#xff0c;正好有个服务器&#xff0c;就用linux吧密钥长度不匹配&#xff0c;设置一下长度即可 文档启动不成功&#xff0c;单独下载了下nginx&#xff0c;docker pull nginx:latest …...

PSCA复位控制集成之复位信号

组件可能支持两种基本的复位类型。 • 冷复位&#xff1a;重置组件中的所有逻辑。用作上电复位。 • 热复位&#xff1a;重置组件中的大部分逻辑。通常&#xff0c;复位的范围是所有功能逻辑。不包括在热复位中的逻辑会随组件类型而变化&#xff0c;但通常会排除诸如调试和 R…...

C#,数值计算,数据测试用的对称正定矩阵(Symmetric Positive Definite Matrix)的随机生成算法与源代码

C.Hermite 1、对称矩阵 对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。1855年,埃米特(C.Hermite,1822-1901年)证明了别的数学家发现的一些矩阵类的特征根的特殊性质,如称为埃…...

多模态大模型入门:从CLIP到Qwen-VL,手把手教你搭建第一个视觉语言模型

多模态大模型实战&#xff1a;从CLIP到Qwen-VL的视觉语言探索之旅 当一张图片胜过千言万语时&#xff0c;多模态大模型正在重新定义人机交互的边界。想象一下&#xff0c;上传一张街景照片&#xff0c;AI不仅能识别出咖啡馆招牌上的文字&#xff0c;还能根据店内装修风格推荐适…...

3大维度解析Awesome Claude Skills:重新定义AI效率边界

3大维度解析Awesome Claude Skills&#xff1a;重新定义AI效率边界 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesom…...

BepInEx Linux环境实战指南:从部署到故障解决

BepInEx Linux环境实战指南&#xff1a;从部署到故障解决 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 引言&#xff1a;Linux玩家的Mod困境 作为Linux平台的Unity游戏玩家&…...

移动机器人自主导航与集群协同:从单机优化到群体智能

1. 移动机器人自主导航的核心框架 当你第一次看到扫地机器人在房间里自如穿梭时&#xff0c;有没有好奇过它是如何做到的&#xff1f;这背后就是移动机器人自主导航技术的魔力。简单来说&#xff0c;自主导航系统就像机器人的"大脑"&#xff0c;由感知、规划、控制三…...

别再纠结Seurat版本了!手把手教你用CCA和Harmony搞定单细胞数据整合(附避坑指南)

单细胞数据整合实战&#xff1a;从CCA到Harmony的精准选择与避坑指南 单细胞RNA测序技术正在重塑我们对复杂生物系统的认知边界。当实验室积累了大量单细胞数据集后&#xff0c;如何将这些分散的数据整合成一个连贯的整体&#xff0c;成为每个研究者必须面对的挑战。我曾见证过…...

数据可视化避坑指南:当产品经理要你做Echarts版丝带图时,这3个技术难点要注意

Echarts丝带图实战&#xff1a;破解企业级数据可视化的三个高阶难题 当医药企业的销售总监盯着大屏上跳动的数字&#xff0c;突然提出"能不能做成Power BI那种丝带图效果"时&#xff0c;开发团队的沉默往往不是因为技术难度&#xff0c;而是对未知领域的本能警惕。这…...

暗黑3终极按键助手:5分钟学会解放双手的完整指南

暗黑3终极按键助手&#xff1a;5分钟学会解放双手的完整指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中繁琐的按键操作而烦…...

**发散创新:用Rust构建Web3.0去中心化身份(DID)验证服务**在Web3.0时代,用户不再依赖中心化的身份提供商(

发散创新&#xff1a;用Rust构建Web3.0去中心化身份&#xff08;DID&#xff09;验证服务 在Web3.0时代&#xff0c;用户不再依赖中心化的身份提供商&#xff08;如Google、微信登录&#xff09;&#xff0c;而是通过去中心化身份&#xff08;Decentralized Identity, DID&…...

3个关键步骤:快速搭建Arduino ESP32开发环境的终极指南

3个关键步骤&#xff1a;快速搭建Arduino ESP32开发环境的终极指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要开始ESP32物联网开发却卡在环境配置上&#xff1f;作为Arduino生态…...

基于Matlab的齿轮动力学仿真探索

基于matlab的齿轮动力学仿真。 该模型考虑动态啮合角和动态间隙非线性的影响&#xff0c;将扭矩直接作用于齿轮&#xff0c;并定义已知的系统参数&#xff1a;齿数、模数、转动惯量、压力角、转速等&#xff0c;输出齿轮X、Y方向的时变位移及FFT结果&#xff0c;综合变形时域图…...