千家信息网

Solidity函数类型是什么

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,本篇内容介绍了"Solidity函数类型是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数类型
千家信息网最后更新 2025年12月01日Solidity函数类型是什么

本篇内容介绍了"Solidity函数类型是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

函数类型(Function Types)

函数也是一种类型,且属于值类型。 可以将一个函数赋值给一个函数类型的变量。还可以将一个函数作为参数进行传递。也可以在函数调用中返回一个函数。 函数类型有两类:内部(internal)和外部(external)函数

内部(internal)函数只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中)。 外部(external)函数由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值。

函数类型定义如下:

function () {internal|external} [pure|constant|view|payable] [returns ()]

如果函数不需要返回,则省去returns () 函数类型默认是internal, 因此internal可以省去。但以此相反,合约中函数本身默认是public的, 仅仅是当作类型名使用时默认是internal的。

有两个方式访问函数,一种是直接用函数名f, 一种是this.f, 前者用于内部函数,后者用于外部函数。

如果一个函数变量没有初始化,直接调用它将会产生异常。如果delete了一个函数后调用,也会发生同样的异常。

如果外部函数类型在Solidity的上下文环境以外的地方使用,他们会被视为function类型。它会编码为20字节的函数所在地址,和在它之前的4字节的函数方法签名一起作为bytes24类型。 合约中的public的函数,可以使用internal和external两种方式来调用。 internal访问形式为f, external访问形式为this.f

成员: 属性 selector

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函数类型是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0