Solidity - 库



库类似于合约,但主要用于重用。库包含其他合约可以调用的函数。Solidity 对库的使用有一些限制。以下是 Solidity 库的关键特性。

  • 如果库函数不修改状态,则可以直接调用它们。这意味着只有纯函数或 View 函数才能从库外部调用。

  • 库不能被销毁,因为它被假定为无状态的。

  • 库不能有状态变量。

  • 库不能继承任何元素。

  • 库不能被继承。

示例

尝试以下代码来了解库在 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;
      
      //search if value is present in the array using Library function
      uint index = Search.indexOf(data, value);
      return index;
   }
}

使用 Solidity 第一个应用 章节中提供的步骤运行以上程序。

注意 - 在点击部署按钮之前,从下拉菜单中选择测试。

输出

0: uint256: 3

使用 For

指令 using A for B; 可用于将库 A 的库函数附加到给定的类型 B。这些函数将使用调用方类型作为其第一个参数(使用 self 标识)。

示例

尝试以下代码来了解库在 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 {
   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;      
      
      //Now data is representing the Library
      uint index = data.indexOf(value);
      return index;
   }
}

使用 Solidity 第一个应用 章节中提供的步骤运行以上程序。

注意 - 在点击部署按钮之前,从下拉菜单中选择测试。

输出

0: uint256: 3
广告