函数类型(Function Types)

函数也是一种类型,且属于值类型。
可以将一个函数赋值给一个函数类型的变量。还可以将一个函数作为参数进行传递。也可以在函数调用中返回一个函数。
函数类型有两类:内部(internal)和外部(external)函数

内部(internal)函数只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中)。
外部(external)函数由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值。

函数类型定义如下:

1
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

如果函数不需要返回,则省去returns ()
函数类型默认是internal, 因此internal可以省去。但以此相反,合约中函数本身默认是public的, 仅仅是当作类型名使用时默认是internal的。

有两个方式访问函数,一种是直接用函数名f, 一种是this.f, 前者用于内部函数,后者用于外部函数。

如果一个函数变量没有初始化,直接调用它将会产生异常。如果delete了一个函数后调用,也会发生同样的异常。

如果外部函数类型在Solidity的上下文环境以外的地方使用,他们会被视为function类型。它会编码为20字节的函数所在地址,和在它之前的4字节的函数方法签名一起作为bytes24类型。
合约中的public的函数,可以使用internal和external两种方式来调用。
internal访问形式为f, external访问形式为this.f

成员: 属性 selector

public (或 external) 函数有一个特殊的成员selector, 它对应一个ABI 函数选择器。

1
2
3
4
5
6
7
pragma solidity ^0.4.16;contract Selector {
function f() public view returns (bytes4) {return this.f.selector;
}
}

下面的代码显示内部(internal)函数类型的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
pragma solidity ^0.4.16;library ArrayUtils {// internal functions can be used in internal library functions because// they will be part of the same code contextfunction 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;}
}

下面的代码显示外部(external)函数类型的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
pragma solidity ^0.4.11;contract Oracle {struct Request {bytes data;function(bytes memory) external callback;}Request[] requests;event NewRequest(uint);function query(bytes data, function(bytes memory) external callback) public {requests.push(Request(data, callback));NewRequest(requests.length - 1);}function reply(uint requestID, bytes response) public {// Here goes the check that the reply comes from a trusted sourcerequests[requestID].callback(response);}
}contract OracleUser {Oracle constant oracle = Oracle(0x1234567); // known contractfunction buySomething() {oracle.query("USD", this.oracleResponse);}function oracleResponse(bytes response) public {require(msg.sender == address(oracle));// Use the data}
}

函数可见性分析

  • public - 任意访问
  • private - 仅当前合约内
  • internal - 仅当前合约及所继承的合约
  • external - 仅外部访问(在内部也只能用外部访问方式访问)

参考文档

Solidity官方文档-类型

智能合约语言 Solidity 教程系列3 - 函数类型相关推荐

  1. 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...

  2. 智能合约语言 Solidity 教程系列8 - Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里. <!-- more --> 写在前面 Solidity 是 ...

  3. 智能合约语言 Solidity 教程系列9 - 错误处理 1

    什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理错误和我们常见的语言不一样,Solidity是通过回退状态的方式来处理错误.发生异常时会撤消当前调用(及其所有子调用)所改变 ...

  4. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  5. 智能合约语言Solidity Solidity API

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约语言Solidity Solidity API Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对 ...

  6. 智能合约语言Solidity 类型介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约语言Solidity 类型介绍11 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合 ...

  7. 以太坊智能合约语言Solidity - 1 走进Solidity

    1. 走进Solidity 1.1 Remix IDE 界面初识 在本地编写我们可能会遇到各种各样的问题,所以使用在线的Remix编译器来编写合约:https://remix.ethereum.org ...

  8. 以太坊智能合约编程简单教程(全)

    有些人说以太坊太难对付,于是我们(译注:指Consensys, 下同)写了这篇文章来帮助大家学习如何利用以太坊编写智能合约和应用.这里所用到的工具,钱包,应用程序以及整个生态系统仍处于开发状态,它们将 ...

  9. 智能合约开发solidity编程语言实例

    智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...

  10. 以太坊智能合约基础——Solidity语言的计量单位和全局变量

    本文重点介绍 Solidity 语言的计量单位和全局变量,包括以太币单位.时间单位.特殊变量和函数三个类别.本文内容来源于 Solidity 0.8.12 版本. 以太币单位 以太币 Ether 单位 ...

最新文章

  1. 计算机检索的优点,专利检索与分析系统拥有哪些优势?
  2. codeforces 153d(日期转换)特殊题目
  3. java 解决汉诺塔问题
  4. shell脚本 如何切换当前目录
  5. switch()语句块的出口:break;
  6. sql cast()函数
  7. dedecms 找后台总结_总结找到后台路径的N总思路方法
  8. 思科模拟器 简单网络连接操作
  9. 2012年10月份考试后感
  10. 计算机动画制作过程原理,计算机制作动画的基本原理及运动规律.ppt
  11. 在C#中解析命令行参数的最佳方法? [关闭]
  12. java 修改图片dpi_如何在不改变DPI的情况下使用java剪切图像的一部分
  13. k8s service nodeport
  14. 在尘世间做最好的自己
  15. java自动发图文微博_自动发带图的微博
  16. 触发器:建立时间和保持时间
  17. 骥遇伯乐,关键的一点是人与事的匹配
  18. 学习linux能做什么?
  19. 微信分享报错errMsg: “updateAppMessageShareData:fail, the permission value is offline verifying“
  20. 2022年6月大学英语六级翻译

热门文章

  1. 解决Echarts官网无法访问的问题
  2. gliffy-confluence-plugin-9.1.2安装
  3. vsto 批量删除列
  4. python可视化(莫烦python代码)
  5. steam服务器102修复,分享steam错误代码102的解决方法
  6. 捷联惯导系统学习6.13(状态估计的误差分配与可观测度分析 )
  7. 概率论 计算机论文,《概率论与数理统计》毕业论文
  8. 汇编语言 emu8086软件的安装和输出Hello,world
  9. C语言求100以内素数
  10. 禁忌搜索算法原理步骤、matlab实现算例及相关代码