|
Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是$ V" O: `3 P( t
- U h5 c9 ]3 P! P' v
- 原始类型 之一
- 或 复合类型
+ Z. R) o" \9 s& B' k) I5 f- p 3 w; ?$ W2 f. [: ]! r4 Q
此外,这些类型中的许多类型可以变为空值。
) @; T2 h. l5 Y' T/ t$ T( |# H' z+ ^* A/ [8 v- y$ z
原始类型" a4 _$ {7 ~7 A* z6 Y3 c6 L3 v# y, ?6 v
Tact 支持许多专为智能合约定制的原始数据类型:
( s5 z% z4 m- m4 M! n& B4 P; B( m: X0 d! V
- Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
- Bool — 经典布尔类型,具有 true 和 false 值。
- Address — TON 区块链中的标准智能合约地址。
- Cell、Builder、Slice — TVM 的底层基元。
- String — 不可变的文本字符串。
- StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。
2 i6 ]0 a- O' `- B- x, N: w' y
1 a: L0 w/ _& K8 i. g/ I
# l; I. |' l& h0 W$ V; u3 K% ]5 o% W1 l- W- Y5 c
布尔值
: n- Y+ w2 m+ p2 @9 l# T, Z5 R# a9 Y6 q# U* J
原始类型 Bool 是经典的布尔类型,只能容纳两个值:true 和 false。它便于布尔和逻辑运算,也便于存储标志。 它便于布尔和逻辑运算,也便于存储标志。
$ T) I. G( {% Q0 o/ Y* ]/ W
6 B# E! G2 ?& e, aTact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如: 这里有许多比较运算符,例如:* M; O; Q$ | v# L
7 S* i5 o# w3 G( @
- && 为 logical AND
- || 为 logical OR
- ! 为 logical inversion
- == 和 != 用于检查相等
- ! 表示非空断言2 n6 y$ U- }6 E4 h! H! E
5 S4 G/ \- F# b9 q* H, }将布尔值持久化到状态中非常节省空间,因为它们只占用1位。 在状态中存储 1000 个布尔值每年大约花费 8 B3 n0 x! Y$ k4 _2 \6 u
0.00072
: o7 c: K& L: H0.00072 TON。9 K9 [, Z) z0 Z8 Z6 f/ i) @
8 V# _* V; z \6 O7 {; L$ Y) ]
+ S0 a8 u$ J# M4 B0 p$ N% {0 g8 ~, n6 D/ K1 [- P& `& G
复合类型/ W( K& K% k' u- w
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:% b7 V/ b8 V( C: q) G1 O7 l
4 @. x0 y/ M% B5 N
$ e" c5 _8 j: b8 { k0 Y3 Z- Maps - 键与值的关联。
- 复合类型,如结构体和消息
- 可选项 - 结构体和消息变量或字段的null值。
. v* B% y9 f o
& C, E! W0 m' o Y2 p. L& a; c9 b- `7 f, _" ^
! d y' `: J4 | @, P8 k
/ R5 N# ^3 P/ b X5 i除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在回退消息接收器(bounced message receivers)中指定。
* ]: n; D7 o: D# K3 S# G% R( @/ O2 F: f+ o$ z
请注意,虽然合约和trait也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。 相反,我们可以使用 initOf表达式来获取给定合约的初始状态。3 @ T3 n6 q* f* P4 ^( L
2 N% J/ p2 q; j. ?8 b, m3 E3 a/ R# @: P3 s1 C9 N7 W
Maps$ r, U! {( `7 x- h
类型map<K, V>用于将类型K的键与类型V的相应值关联起来。
6 o$ z' ?6 L% l" @7 t0 b. o" w* t7 S
示例map<K, V>" a# k0 Z. S. o" X9 A+ [. C9 U0 b& X; k
- let mapExample: map<Int, Int> = emptyMap(); // empty map with Int keys and values
复制代码 + [% o |; e5 W! N2 v4 |/ R3 o
5 e( l0 D8 {2 B) `, o" b+ @
! F4 ~ s( S5 v* a! E8 k
( C0 S4 K& o& v8 E9 H) }结构和消息
& p2 V' N7 I0 h _# X( Z2 T# J7 p6 H结构和消息是将多个原始类型组合成复合类型的两种主要方式。' W- ]) h2 y1 k9 e" q% U) c% n
+ o8 f3 r9 S+ R+ f
Struct 示例:
6 A& Q" B4 {4 u% }1 h- struct Point {/ X* x# r$ b) g4 e& k0 X T# I3 t
- x: Int;
. i; ]- P- h$ j0 v" w - y: Int;+ I$ X6 }3 b" i' X2 u1 y
- }
复制代码 Message 示例:. i$ } |2 b0 j: x$ }2 ]
- // Custom numeric id of the Message
: \" X# m$ d, w( C) L - message(0x11111111) SetValue {
/ M8 U9 a7 O3 S# _ - key: Int;" O3 x4 L& S8 d# V/ X+ Y; O {
- value: Int?; // Optional, Int or null( Z4 U1 q" ]/ e) U# C
- coins: Int as coins; // Serialization into TL-B types
% p7 T2 h5 o% h - }
复制代码- let opt: Int? = null; // Int or null, with explicitly assigned null
复制代码 在专门页面了解更多信息:可选项。
, j% F2 r- l. L3 D/ s
, i, F, G h$ j( N5 }/ u7 v# M8 p
* T- R" s1 T& V合约
2 }( Y0 `2 O3 ~" ~TON区块链上的合约在Tact中作为智能合约的主要入口。 它包含了一个TON合约的所有functions、getters和receivers等多种内容。8 F$ R9 n; O3 n5 e/ }5 {0 n$ A6 U
3 o; O4 ^# u' z. _$ M! o合约示例:/ [( V( P1 S# L7 x4 e* _) Z
; F4 i' {; U" K1 [2 u k4 K% b' B- contract HelloWorld {0 t1 m4 J% |0 B* u6 C( L
- // Persistent state variable
6 i' D5 ], j2 w1 x: X' x# j1 h( s - counter: Int;
1 z+ x& ?5 S3 M. y8 g5 m - - Z' t( q% L' V h! S9 h& G$ N- h
- // Constructor function init(), where all the variables are initialized
k1 q7 R; B/ ], O9 s$ R- m - init() {
1 v& K1 |* \; O, i# u - self.counter = 0;
- N+ q/ u5 C5 H* R - }# k5 N* E$ [) M+ d% V. v
- * v' L$ n6 _% w, ]4 `6 e5 [5 ]
- // Internal message receiver, which responds to a string message "increment"" ?* I; n* U) [2 _
- receive("increment") {7 b0 o0 h* a' s% Z6 b& @1 w
- self.counter += 1;: y4 `4 K- J9 y$ v, c) P9 a5 q4 S
- }# r7 z% }$ Q% `" ^
- ( W d$ l% h! m- d
- // Getter function with return type Int. p- e% O$ P) k/ I3 L7 |1 ~
- get fun counter(): Int {
- x7 N4 K/ Y8 i+ T - return self.counter;* U5 i2 I$ V: c# j. a9 J; G
- }1 `( e& ]& G$ o1 X- h( A
- }
复制代码- trait Ownable {
1 j$ N* A- z6 W' i# h - // Persistent state variable, which cannot be initialized in the trait5 y+ |) w/ p3 Q
- owner: Address;- }% f' D, J6 H4 f5 c0 h' X
- - D& x& x4 Z2 i/ g$ c3 t- ~" ~, o
- // Internal function, b' h0 ?5 `" g+ ^4 q
- fun requireOwner() {. B! q# L. W; ] u$ b, W( j
- throwUnless(132, context().sender == self.owner);9 w2 Z) M. L4 y+ D% U
- }
+ b6 l( r0 n/ P - ( X, b, W/ p! K5 r
- // Getter function with return type Address
. Q. L& m. X4 ^ - get fun owner(): Address {' }% Z5 L9 y) @. H# X
- return self.owner;2 X. s. o0 s( b* |( I2 d
- }2 t' e. J8 I' M" v" O% g' z, V' i
- }
复制代码 ! D) Y6 j6 u h8 Q" ^' h+ x+ Z' m$ g- h
' \! u& U* Y3 W# w
3 `8 w: @. s" t0 c1 d: N( p& ` |
|