跳转到内容

类型系统概述

Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是

Additionally, many of those types can be made nullable.

原始类型

Tact 支持许多专为智能合约定制的原始数据类型:

  • Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
  • Bool — 经典布尔类型,具有 truefalse 值。
  • Address — TON 区块链中的标准智能合约地址
  • CellBuilderSliceTVM 的底层基元。
  • String — 不可变的文本字符串。
  • StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。

布尔

原始类型 Bool 是经典的布尔类型,只能容纳两个值:truefalse。它便于布尔和逻辑运算,也便于存储标志。

Tact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如:

将 bools 持久化为状态非常节省空间,因为它们只占用 1 位。 每年在州花费存储 1000 个布尔约需 0.000720.00072 ton 。

复合类型

使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:

除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在弹回消息接收器中指定。

请注意,虽然合约特质也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。相反,我们可以使用initOf表达式来获取给定合约的初始状态。

映射

类型map<k, v>用于将数据与相应的键关联起来。

let mapExample: map<Int, Int> = emptyMap(); // 带有 Int 键和值的空地图

在专门页面了解更多信息:[地图][地图]。

[Maps]: /zh-cn/book/maps

结构和信息

Possible key types:

Structs and Messages are two main ways of combining multiple primitive types into a composite one.

Example of a Struct:

struct Point {
xInt;
yInt;
}

Example of a Message:

// Custom numeric id of the Message
message(0x11111111) SetValue {
key: Int;
value: Int?; // Optional
coins: Int as coins; // Serialization into TL-B types
}

有关它们的更多信息,请访问专门页面:结构和信息

可选项

所有原始类型以及结构体和消息都可以为空,并持有一个特殊的 null值。

[可选项][可选项]示例:

let opt: Int? = null; // Int or null, with explicitly assigned null

Learn more about them on a dedicated page: [Optionals][optionals].

合同

Contracts are the main entry of a smart contract on the TON blockchain. It holds all functions, getters, and receivers of a TON contract.

合同示例

contract HelloWorld {
// Persistent state variable
counter: Int;
// Constructor function init(), where all the variables are initialized
init() {
self.counter = 0;
}
// Internal message receiver, which responds to a string message "increment"
receive("increment") {
self.counter += 1;
}
// Getter function with return type Int
get fun counter(): Int {
return self.counter;
}
}

or Contracts and Traits

特质

Tact 不支持经典的类继承,而是引入了特质(traits)的概念。它们的结构与合约相同,但不能初始化持久状态变量

特质还可以让继承它的契约重写其函数的行为和常量的值。

来自 @stdlib/ownable 的 trait Ownable 示例:

trait Ownable {
// Persistent state variable, which cannot be initialized in the trait
owner: Address;
// Internal function
fun requireOwner() {
nativeThrowUnless(132, context().sender == self.owner);
}
// Getter function with return type Address
get fun owner(): Address {
return self.owner;
}
}

contract 使用了 trait Ownable

contract Treasure with Ownable {
// Persistent state variable, which MUST be defined in the contract
owner: Address;
// Constructor function init(), where all the variables are initialized
init(owner: Address) {
self.owner = owner;
}
}