库类似于合约,但主要作用是代码重用。库中包含了可以被合约调用的函数。
Solidity中,对库的使用有一定的限制。以下是库的主要特征。
示例
尝试下面的代码,来理解库是如何工作的。
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;
}
}
可以参考Solidity – 第一个程序中的步骤,运行上述程序。
在单击deploy按钮之前,从下拉菜单中选择Test。
输出
0: uint256: 3
Using For
using A for B
指令,可用于将库A的函数附加到给定类型B。这些函数将把调用者类型作为第一个参数(使用self
标识)。
示例
尝试下面的代码,来理解Using For
是怎么工作的。
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;
}
}
可以参考Solidity – 第一个程序中的步骤,运行上述程序。
在单击deploy按钮之前,从下拉菜单中选择Test。
输出
0: uint256: 3