|
Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是* z' ^, u' F( S4 G M
- N) v: I' u; o5 L. p- P" f- 原始类型 之一
- 或 复合类型
( }- A" p$ a* ]; L" k1 c* j \
7 j% p! a! H5 d7 }+ l# t$ ?! L1 w此外,这些类型中的许多类型可以变为空值。* P& s+ c4 G4 e8 b& c% m
" b5 H- v. H0 [原始类型
; V- U4 d+ e+ V/ U: O! eTact 支持许多专为智能合约定制的原始数据类型:
8 K; j2 s) i2 D8 J
0 F3 K4 _( I- N- Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
- Bool — 经典布尔类型,具有 true 和 false 值。
- Address — TON 区块链中的标准智能合约地址。
- Cell、Builder、Slice — TVM 的底层基元。
- String — 不可变的文本字符串。
- StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。2 ~- ~" Q r& p: o% |' H- V
( W4 r6 C2 f# A7 X* e: }1 z$ p5 N7 D: @& R5 ^
# o* z0 y+ [0 J* s' q布尔值
4 p8 J% M( a' `3 q n* f4 d1 l7 e% H( n, @& ]/ I; y
原始类型 Bool 是经典的布尔类型,只能容纳两个值:true 和 false。它便于布尔和逻辑运算,也便于存储标志。 它便于布尔和逻辑运算,也便于存储标志。# R* K7 Z! R5 w4 ?1 c( G
2 }3 n; j' W0 ]- L1 I/ m
Tact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如: 这里有许多比较运算符,例如:
* }6 w, G$ ^$ \/ B9 V1 e8 c G
" b# m, ?+ M4 S- && 为 logical AND
- || 为 logical OR
- ! 为 logical inversion
- == 和 != 用于检查相等
- ! 表示非空断言
$ c# Q' B$ i: @& ~ $ d* x' ?- X; V1 G
将布尔值持久化到状态中非常节省空间,因为它们只占用1位。 在状态中存储 1000 个布尔值每年大约花费 ! }# {3 i! L. n6 F6 i
0.00072
t) d7 b/ g/ U! u; I1 h! e. C0.00072 TON。
+ o8 E" T' L7 r/ ]8 q
* d$ p# ^) w, `5 u! w) \' M4 v& X0 G+ E5 n
' q8 g6 r; b3 {3 E% n复合类型0 M# h+ ]8 M6 y! Y
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:
4 t! a! O1 f* Z1 T; ^
0 i* \% E3 Q4 S( {$ R" u, t2 N& v* c$ [3 @' y: c- r. T5 g( n
- Maps - 键与值的关联。
- 复合类型,如结构体和消息
- 可选项 - 结构体和消息变量或字段的null值。
( s0 \4 U5 k A8 W; V! { , l0 m' k" w' f$ H4 k, `* n
( d3 u' R7 I! R' Z
( T4 K$ P! L: Z3 N3 p( l
$ I* |& }0 Q- K1 `) w( O% q$ e3 t, {除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在回退消息接收器(bounced message receivers)中指定。
$ [' m5 ~& T. T
. p9 D5 n5 H4 ~ m7 t请注意,虽然合约和trait也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。 相反,我们可以使用 initOf表达式来获取给定合约的初始状态。
. b1 G: V8 b, w V$ C! c" w
& V$ e$ Q$ q$ p* E7 w G& z: m0 Y# X' O3 A) s
Maps
% S2 P/ d$ q+ o/ @3 D) |类型map<K, V>用于将类型K的键与类型V的相应值关联起来。. t4 W; o4 n0 C. f0 o$ [- D
$ G) B, ^+ P0 s. J; A% X
示例map<K, V>" h: Z$ O: k1 q7 Q
- let mapExample: map<Int, Int> = emptyMap(); // empty map with Int keys and values
复制代码
, W7 M/ g3 B; f3 Z( }( P# Z! x t- B1 R9 S( N! V, b0 U
: f" s1 s/ j7 H5 L0 ~% X
2 G; _! b! {2 P' r# A/ v% R结构和消息
7 c# B! R: E T! ]9 j/ r, a结构和消息是将多个原始类型组合成复合类型的两种主要方式。4 J$ G- u6 v& O# X9 a; z/ ?
m) r, W' y5 n2 N# l: `4 I3 u
Struct 示例:3 t- V( l5 K& y
- struct Point {8 i7 t! U# b0 R. u- {+ K
- x: Int;
* k: ?# n4 Z4 J& l0 S ~ - y: Int;1 e% i8 G" ~8 g/ W
- }
复制代码 Message 示例:8 }; v0 V# G# M, d( |
- // Custom numeric id of the Message. A% p5 x' p4 `
- message(0x11111111) SetValue {. Y+ T# C. c1 z$ m$ @" u8 N) q) d
- key: Int;7 u& G2 h; Z8 ]
- value: Int?; // Optional, Int or null
/ D3 D; _% a7 r. ?" g- a - coins: Int as coins; // Serialization into TL-B types
t% \* q7 v* \! w - }
复制代码- let opt: Int? = null; // Int or null, with explicitly assigned null
复制代码 在专门页面了解更多信息:可选项。
* C/ F! h% g9 x* r
, u9 I( B2 O& D9 G6 {" M; f6 j/ X* \0 u& ]
合约
2 C2 F2 I+ L2 F/ E5 T4 {- G! eTON区块链上的合约在Tact中作为智能合约的主要入口。 它包含了一个TON合约的所有functions、getters和receivers等多种内容。6 b' s* V1 H* n8 t$ a# l! r" i
: i& ^- w; ]% n$ k
合约示例:& \$ e% g8 d8 h, a
- u, H+ m; u5 s5 C4 L
- contract HelloWorld {
* A& G! X8 M* M8 X5 e' v - // Persistent state variable
2 w/ |, g" q0 m( N! I6 x) ]9 n8 N6 g - counter: Int;
X# r4 b; k; F" l( |
' i* r9 o7 [5 N& X- // Constructor function init(), where all the variables are initialized' W3 g3 x- t8 c
- init() {& ~8 \; H/ H3 D, a% O) Z8 G8 h* n
- self.counter = 0;
% [4 D2 ]( ]0 E# G2 k! X - }
N. H3 S! A4 l* m
# p4 `, W' o6 r2 x# x- W4 R- // Internal message receiver, which responds to a string message "increment"
! g. w0 m' X& N( T6 N* C - receive("increment") {
5 I; Z& K6 c# U1 [) i, G- M/ S - self.counter += 1;
/ |3 }! ^( @( Q" D' P, }% ? - }
z, r& a+ E. C) x0 Q - 2 T! ~# B+ e5 A. V. N
- // Getter function with return type Int, Y E; f: R h4 Q+ O
- get fun counter(): Int {
; S8 ]* |' k& P; R! A - return self.counter;
0 f5 ?6 X+ }- S1 b7 J5 A - }
& ~) N$ a2 D4 {: p6 l/ t: T" o - }
复制代码- trait Ownable {; k+ ?5 d3 \9 M* K u( f
- // Persistent state variable, which cannot be initialized in the trait
l0 z% ]% {8 \- f; H" p - owner: Address;
8 `2 D, l% m _& y+ F - / u O# c5 v" }/ e3 o# ] |
- // Internal function
1 d* z2 {/ D- \3 @& k9 O( ] - fun requireOwner() {0 c0 @( f$ b- @
- throwUnless(132, context().sender == self.owner);# L5 I( B% J. }( C; G1 ~
- }' C# R/ I3 Q1 h7 v% A3 Q6 L# q
- ; U- J$ k3 p0 l- X: c c( `8 J
- // Getter function with return type Address+ O% o/ ~; M- ~
- get fun owner(): Address {
0 y2 v3 l2 c7 @* B: T9 u - return self.owner;' Z* I3 r# M$ w
- }2 h& G" C. Z/ p
- }
复制代码 . K% u2 y9 _( k+ z: C
/ \/ Q* P# y/ p# ^ x$ m
9 j( h- o0 }9 \. I
|
|