0%

solidity | 函数类型 public private external internal

这一章讲述 solidity 的函数类型。

函数是一种类型,可以作为变量,也可以作为返回值。默认 public

两种函数类型

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

声明一个函数

1
2
function foo(int);
function foo(int) external returns (int);

声明一个函数类型的变量

1
2
function (int) foo;
function (int) external returns (int) foo;

成员

  • .seletor 属性 「内部函数没有这个属性」
    • 返回函数选择器

案例 外部内书

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);
}


}

使用 cgas22477

案例 内部函数

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);
}


}

使用 cgas21743

饿,这个不知道是不是我代码问题,感觉 gas 相差不大。

案例 selector

1
2
3
4
5
6
7
8
9
10
pragma solidity ^0.4.18;

contract Test{

// 0x6d4ce63c
function get() public view returns (bytes4){
return this.get.selector;
}

}

上面的代码返回 0x6d4ce63c

其实,这就是浏览器中的 methodID

请我喝杯咖啡吧~