---
title: 接收消息
description: 最常见的消息类型是内部消息 - 从一个合约发送到另一个合约的消息
prev:
  link: /zh-cn/book/functions
  label: 函数
---

TON 是一个分布式区块链，这意味着合约之间的通信是通过发送和接收信息完成的。  最常见的消息类型是内部消息――从一个合约(或一个钱包)发给另一个合约。

## 接收内部消息

要接收所需类型的消息，您需要声明一个接收函数，例如`receive("increment"){:tact}`。 此符号表示接收器函数的声明，当具有值 `"increment"{:tact}` 的文本被发送到合约时，将调用该函数。 函数体可以修改合约的状态，并向其他合约发送消息。 不可能直接调用`receiver`。 如果需要重用某些逻辑，可以声明一个函数，然后从`receiver`中调用。

有多个接收函数。 所有接收函数的处理顺序如下：

- `receive(){:tact}` - 向合约发送空消息时调用。
- `receive("message"){:tact}` - 向合约发送带有特定注释的文本消息时调用。
- `receive(str: String){:tact}` - 向合约发送任意文本消息时调用。
- `receive(msg: MyMessage){:tact}`-当向合约发送 `MyMessage` 类型的二进制消息时调用。
- `receive(msg: Slice){:tact}` - 向合约发送未知类型的二进制消息时调用。

```tact
message MyMessage {
    value: Int;
}

contract MyContract {
    receive() {
        // ...
    }
    receive("message") {
        // ...
    }
    receive(str: String) {
        // ...
    }
    receive(msg: MyMessage) {
        // ...
    }
    receive(msg: Slice) {
        // ...
    }
}
```

用下划线`_{:tact}`命名接收函数的参数时，其值将被视为未使用的值并被丢弃。  当您不需要检查接收到的消息，而只想让它传达特定的操作码时，这就很有用了：

```tact
message(42) UniverseCalls {}

contract Example {
    receive(_: UniverseCalls) {
        // Got a Message with opcode 42
    }
}
```
