Solidity 库
库类似于合约,但主要作用是代码重用。库中包含了可以被合约调用的函数。
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。
输出
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。
输出