本篇內容介紹了“Solidity函數類型是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
函數也是一種類型,且屬于值類型。 可以將一個函數賦值給一個函數類型的變量。還可以將一個函數作為參數進行傳遞。也可以在函數調用中返回一個函數。 函數類型有兩類:內部(internal)和外部(external)函數
內部(internal)函數只能在當前合約內被調用(在當前的代碼塊內,包括內部庫函數,和繼承的函數中)。 外部(external)函數由地址和函數方法簽名兩部分組成,可作為外部函數調用的參數,或返回值。
函數類型定義如下:
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]
如果函數不需要返回,則省去returns (<return types>) 函數類型默認是internal, 因此internal可以省去。但以此相反,合約中函數本身默認是public的, 僅僅是當作類型名使用時默認是internal的。
有兩個方式訪問函數,一種是直接用函數名f, 一種是this.f, 前者用于內部函數,后者用于外部函數。
如果一個函數變量沒有初始化,直接調用它將會產生異常。如果delete了一個函數后調用,也會發生同樣的異常。
如果外部函數類型在Solidity的上下文環境以外的地方使用,他們會被視為function類型。它會編碼為20字節的函數所在地址,和在它之前的4字節的函數方法簽名一起作為bytes24類型。 合約中的public的函數,可以使用internal和external兩種方式來調用。 internal訪問形式為f, external訪問形式為this.f
public (或 external) 函數有一個特殊的成員selector, 它對應一個ABI 函數選擇器。 ```js pragma solidity ^0.4.16;
contract Selector { function f() public view returns (bytes4) { return this.f.selector; } } ```
下面的代碼顯示內部(internal)函數類型的使用:
pragma solidity ^0.4.16; library ArrayUtils { // internal functions can be used in internal library functions because // they will be part of the same code context function map(uint[] memory self, function (uint) pure returns (uint) f) internal pure returns (uint[] memory r) { r = new uint[](self.length); for (uint i = 0; i < self.length; i++) { r[i] = f(self[i]); } } function reduce( uint[] memory self, function (uint, uint) pure returns (uint) f ) internal pure returns (uint r) { r = self[0]; for (uint i = 1; i < self.length; i++) { r = f(r, self[i]); } } function range(uint length) internal pure returns (uint[] memory r) { r = new uint[](length); for (uint i = 0; i < r.length; i++) { r[i] = i; } } } contract Pyramid { using ArrayUtils for *; function pyramid(uint l) public pure returns (uint) { return ArrayUtils.range(l).map(square).reduce(sum); } function square(uint x) internal pure returns (uint) { return x * x; } function sum(uint x, uint y) internal pure returns (uint) { return x + y; } }
下面的代碼顯示外部(external)函數類型的使用:
pragma solidity ^0.4.11; contract Oracle { struct Request { bytes data; function(bytes memory) external callback; } Request[] requests; event NewRequest(uint); function query(bytes data, function(bytes memory) external callback) public { requests.push(Request(data, callback)); NewRequest(requests.length - 1); } function reply(uint requestID, bytes response) public { // Here goes the check that the reply comes from a trusted source requests[requestID].callback(response); } } contract OracleUser { Oracle constant oracle = Oracle(0x1234567); // known contract function buySomething() { oracle.query("USD", this.oracleResponse); } function oracleResponse(bytes response) public { require(msg.sender == address(oracle)); // Use the data } }
public - 任意訪問
private - 僅當前合約內
internal - 僅當前合約及所繼承的合約
external - 僅外部訪問(在內部也只能用外部訪問方式訪問)
“Solidity函數類型是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。