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。

输出

0: uint256: 3

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。

输出

0: uint256: 3


浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载