特性——库Libraries

Seven 2022-01-04 17:01:44
Categories: > Tags:

库(Libraries)

库类似于合约,但主要作用是代码重用。库中包含了可以被合约调用的函数。

Solidity中,对库的使用有一定的限制。以下是库的主要特征。

示例

尝试下面的代码,来理解库是如何工作的。

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
pragma solidity ^0.5.0;

library Search {
function indexOf(uint[] storage self, uint value) public view returns (uint) {
for (uint i = 0; i < self.length; i++) if (self[i] == value) return i;
return uint(-1);
}
}
contract Test {
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
data.push(4);
data.push(5);
}
function isValuePresent() external view returns(uint){
uint value = 4;

// 使用库函数搜索数组中是否存在值
uint index = Search.indexOf(data, value);
return index;
}
}
Using For指令

using A for B指令,可用于将库A的函数附加到给定类型B。这些函数将把调用者类型作为第一个参数(使用self标识)。

示例

尝试下面的代码,来理解Using For是怎么工作的。

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
pragma solidity ^0.5.0;

library Search {
function indexOf(uint[] storage self, uint value) public view returns (uint) {
for (uint i = 0; i < self.length; i++)if (self[i] == value) return i;
return uint(-1);
}
}
contract Test {
using Search for uint[];
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
data.push(4);
data.push(5);
}
function isValuePresent() external view returns(uint){
uint value = 4;

// data 表示库
uint index = data.indexOf(value);
return index;
}
}

附言

基础学习资料

与智能合约交互

源码

示例项目

调试工具