Solidity教程

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
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4