Solidità - Biblioteche

Le biblioteche sono simili ai contratti ma sono principalmente destinate al riutilizzo. Una libreria contiene funzioni che altri contratti possono chiamare. Solidity ha alcune limitazioni sull'uso di una libreria. Di seguito sono riportate le caratteristiche chiave di una Solidity Library.

  • Le funzioni di libreria possono essere chiamate direttamente se non modificano lo stato. Ciò significa che le funzioni pure o di visualizzazione possono essere chiamate solo dall'esterno della libreria.

  • La libreria non può essere distrutta poiché si presume sia apolide.

  • Una libreria non può avere variabili di stato.

  • Una libreria non può ereditare alcun elemento.

  • Una libreria non può essere ereditata.

Esempio

Prova il codice seguente per capire come funziona una libreria in 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;
   }
}

Eseguire il programma precedente utilizzando i passaggi forniti nel capitolo Solidity First Application .

Note - Seleziona Test dal menu a discesa prima di fare clic sul pulsante di distribuzione.

Produzione

0: uint256: 3

Utilizzando For

La direttiva using A for B; può essere utilizzato per collegare le funzioni di libreria della libreria A a un dato tipo B. Queste funzioni utilizzeranno il tipo di chiamante come primo parametro (identificato utilizzando self).

Esempio

Prova il codice seguente per capire come funziona una libreria in 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;
   }
}

Eseguire il programma precedente utilizzando i passaggi forniti nel capitolo Solidity First Application .

Note - Seleziona Test dal menu a discesa prima di fare clic sul pulsante di distribuzione.

Produzione

0: uint256: 3