Skip to main content

库合约

  • 库合约的方法可以通过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);
}
}