Solidity-ライブラリ
ライブラリはコントラクトに似ていますが、主に再利用を目的としています。ライブラリには、他のコントラクトが呼び出すことができる関数が含まれています。Solidityには、ライブラリの使用に一定の制限があります。SolidityLibraryの主な特徴は次のとおりです。
ライブラリ関数は、状態を変更しない場合は直接呼び出すことができます。つまり、純粋な関数またはビュー関数は、ライブラリの外部からのみ呼び出すことができます。
ライブラリはステートレスであると想定されているため、破棄することはできません。
ライブラリに状態変数を含めることはできません。
ライブラリは要素を継承できません。
ライブラリは継承できません。
例
次のコードを試して、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 First Applicationの章に記載されている手順を使用して、上記のプログラムを実行します。
Note −展開ボタンをクリックする前に、ドロップダウンから[テスト]を選択します。
出力
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 First Applicationの章に記載されている手順を使用して、上記のプログラムを実行します。
Note −展開ボタンをクリックする前に、ドロップダウンから[テスト]を選択します。
出力
0: uint256: 3