函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。
函数类型有两类:-
- 内部(internal) 函数
- 外部(external) 函数
- 内部函数只能在当前合约内被调用(更具体来说,在当前代码块内,包括内部库函数和继承的函数中),因为它们不能在当前合约上下文的外部被执行。 调用一个内部函数是通过跳转到它的入口标签来实现的,就像在当前合约的内部调用一个函数。
- 外部函数由一个地址和一个函数签名组成,可以通过外部函数调用传递或者返回。
函数类型表示成如下的形式
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]
- view 修饰的函数 ,是constant的别名,只能读取storage变量的值,不能写入。pure 修饰的函数 ,不能对storage变量进行读写。constant 常量,意味着不可变化。可以读取状态变量但是不能改变,5.0之后会废除。以上本地执行均不需要消耗gas。
-
payable 当一个函数被 payable 修饰,表示调用这个函数时,可以附加发送一些 ETH(当然也可以不发)。没有加 payable 的函数,则没有方法接受 ETH, 附加 ETH 调用会出错。
- 如果函数类型不需要返回,则需要删除整个
returns (<return types>)
部分。 - 函数类型默认是内部函数,因此不需要声明
internal
关键字。 与此相反的是,合约中的函数本身默认是 public 的,只有当它被当做类型名称时,默认才是内部函数。 - 有两种方法可以访问当前合约中的函数:一种是直接使用它的名字,
f
,另一种是使用this.f
。 前者适用于内部函数,后者适用于外部函数。 - 如果当函数类型的变量还没有初始化时就调用它的话会引发一个异常。 如果在一个函数被
delete
之后调用它也会发生相同的情况。 - 如果外部函数类型在 Solidity 的上下文环境以外的地方使用,它们会被视为
function
类型。 该类型将函数地址紧跟其函数标识一起编码为一个bytes24
类型。。
请注意,当前合约的 public 函数既可以被当作内部函数也可以被当作外部函数使用。 如果想将一个函数当作内部函数使用,就用 f
调用,如果想将其当作外部函数,使用 this.f
。
除此之外,public(或 external)函数也有一个特殊的成员变量称作 selector
,可以返回 ABI 函数选择器:
pragma solidity ^0.4.16; contract Selector { function f() public view returns (bytes4) { return this.f.selector; } }
标签:调用,函数,外部,类型,public,内部 From: https://www.cnblogs.com/shyroke/p/16755798.html