类型系统概述
Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是
Additionally, many of those types can be made nullable.
原始类型
Tact 支持许多专为智能合约定制的原始数据类型:
Int
— Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。Bool
— 经典布尔类型,具有true
和false
值。Address
— TON 区块链中的标准智能合约地址。Cell
、Builder
、Slice
— TVM 的底层基元。String
— 不可变的文本字符串。StringBuilder
— 辅助类型,允许以节省 gas 的方式连接字符串。
布尔
原始类型 Bool
是经典的布尔类型,只能容纳两个值:true
和 false
。它便于布尔和逻辑运算,也便于存储标志。
Tact 中没有隐式类型转换,因此两个布尔值的加法(+
)是不可能的。这里有许多比较运算符,例如:
&&
为 logical AND||
为 logical OR!
为 logical inversion==
和!=
用于检查相等!
表示非空断言
将 bools 持久化为状态非常节省空间,因为它们只占用 1 位。 每年在州花费存储 1000 个布尔约需 ton 。
复合类型
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:
除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>
,它只能在弹回消息接收器中指定。
请注意,虽然合约和特质也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。相反,我们可以使用initOf
表达式来获取给定合约的初始状态。
映射
类型map<k, v>
用于将数据与相应的键关联起来。
在专门页面了解更多信息:[地图][地图]。
[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:
Example of a Message:
有关它们的更多信息,请访问专门页面:结构和信息。
可选项
所有原始类型以及结构体和消息都可以为空,并持有一个特殊的 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.
合同示例:
特质
Tact 不支持经典的类继承,而是引入了特质(traits)的概念。它们的结构与合约相同,但不能初始化持久状态变量。
来自 @stdlib/ownable
的 trait Ownable
示例: