这一章讲述 solidity
的函数类型。
函数是一种类型,可以作为变量,也可以作为返回值。默认 public
。
两种函数类型
public
: 内部外部均可见。
private
: 只能从本合约内部访问,继承的合约也不能用。
external
: 只能从合约外部访问(但是可以用 this.f()
来调用,f
是函数名)。
internal
: 只能从合约内部访问,继承的合约可以用。
声明一个函数
1 2
| function foo(int); function foo(int) external returns (int);
|
声明一个函数类型的变量
1 2
| function (int) foo; function (int) external returns (int) foo;
|
成员
案例 外部内书
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
| pragma solidity ^0.4.18;
contract Test{
function a(uint x) external returns(uint){ return x * x; }
function b(uint x) external returns(uint){ return 2 * x; }
function c(bool m,uint x) external returns(uint){ function (uint) external returns (uint) f;
if(m){ f = this.a; }else{ f = this.b; }
return f(x); }
function d(function (uint) external returns (uint) f,uint x) external returns(uint){ return f(x); }
}
|
使用 c
的 gas
是 22477
。
案例 内部函数
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
| pragma solidity ^0.4.18;
contract Test{
function a(uint x) internal returns(uint){ return x * x; }
function b(uint x) internal returns(uint){ return 2 * x; }
function c(bool m,uint x) external returns(uint){ function (uint) internal returns (uint) f;
if(m){ f = a; }else{ f = b; }
return f(x); }
function d(function (uint) external returns (uint) f,uint x) external returns(uint){ return f(x); }
}
|
使用 c
的 gas
是 21743
。
饿,这个不知道是不是我代码问题,感觉 gas
相差不大。
案例 selector
1 2 3 4 5 6 7 8 9 10
| pragma solidity ^0.4.18;
contract Test{
function get() public view returns (bytes4){ return this.get.selector; }
}
|
上面的代码返回 0x6d4ce63c
其实,这就是浏览器中的 methodID
。