库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而存在,使用library定义。库合约一般都是一些好用的函数合集。
库和普通合约主要有以下几点不同:
- 不能存在状态变量
- 不能够继承或被继承
- 不能接收以太币
- 不可以被销毁
- 函数可视范围通常为internal
库合约调用
通过库合约名称调用库函数
定义一个库合约,包含一个比较两个数大小的函数:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
library Math {
function max(uint x, uint y) internal pure returns(uint) {
return x > y ? x : y;
}
}
定义一个普通合约调用库合约,通过库合约名称调用库函数:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract Examples {
function max(uint x, uint y) external pure returns(uint) {
// 通过库合约名称调用库函数
return Math.max(x, y);
}
}
使用using for调用
定义一个库合约:
library ArrayFind{
// 查找数组中指定元素的下标
function findIdx(uint[] storage arr, uint x) internal view returns(uint) {
for(uint i=0; i<arr.length; i++) {
if (arr[i] == x) {
return i;
}
}
revert("not found");
}
}
定义一个普通合约,通过using for调用库函数:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract Examples1 {
// 表示uint[]类型的变量具有ArrayFind库的所有函数功能,使用 变量.函数名来调用
using ArrayFind for uint[];
uint[] arr = [1,2,3];
function findIdx(uint x) external view returns(uint) {
// return ArrayFind.findIdx(arr, x);
return arr.findIdx(x); // 调用ArrayFind的findIdx函数
}
}