# Solidity 教程系列3 - 函数类型

Solidity 教程系列第三篇 - Solidity函数类型介绍。

## 写在前面

Solidity 是以太坊智能合约编程语言，阅读本文前，你应该对以太坊、智能合约有所了解，如果你还不了解，建议你先看以太坊是什么

## 函数类型（Function Types）

`function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]`

### 成员: 属性 selector

public (或 external) 函数有一个特殊的成员selector, 它对应一个ABI 函数选择器。

```pragma solidity ^0.4.16;

contract Selector {
function f() public view returns (bytes4) {
return this.f.selector;
}
}```

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; }}

```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
oracle.query("USD", this.oracleResponse);
}
function oracleResponse(bytes response) public {
// Use the data
}
}```

## 函数可见性分析

• public - 任意访问
• private - 仅当前合约内
• internal - 仅当前合约及所继承的合约
• external - 仅外部访问（在内部也只能用外部访问方式访问）

62 篇文章30 人订阅

0 条评论

## 相关文章

1724

### Swift 4.0 新特性

WWDC 2017 带来了很多惊喜，在这次大会上，Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前，虽然正式版要8月底9月初才会公布，但很多强大...

2269

1132

### 重构一个繁琐的数据结构

在GIX4项目的开发过程中，遇到一个比较复杂的数据结构。复杂，是因为它有许多限制条件。我的工作是在现有系统中，添加新的功能，并在过程中重构部分旧代码。 ...

23410

3661

3695

1153

1383

2957

### Javascript即将迎来Optional Chaining

Optional Chaining 现在处于 Stage 1。 它是什么？ Optional Chaining 使我们能检查一个对象上面是否存在某属性。其它一些...

3665