库合约
- 库合约的方法可以通过
delegatecall
调用,这意味着如果库函数被调用,它的代码在调用合约的上下文中执行,即this
指向调用合约 - 如果库合约不修改状态变量(pure 或 view),库函数仅可以通过直接调用来使用,不能使用
delegatecall
来调用 - 库合约中传递状态变量需要使用
storage
引用存储类型 - 可以使用
using for
语法将库应用到某个类型中
与合约相比,库的限制:
- 没有状态变量
- 不能够继承或被继承
- 不能接收以太币
- 不可以被销毁
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
library Math {
function max(uint x, uint y) internal pure returns (uint) {
return x >= y ? x : y;
}
}
contract Test {
function testMax(uint x, uint y) external pure returns (uint) {
return Math.max(x,y);
}
}
library ArrayLib {
function find(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");
}
}
contract TestArray {
using ArrayLib for uint[];
uint[] public arr = [3,2,1];
function find() external view returns (uint index) {
// 写法一
// return ArrayLib.find(arr,2);
// 写法二
return arr.find(2);
}
}