|
Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是
4 Z1 B. R' c3 ~+ D3 F, y0 d
e3 \/ ?4 ?1 K7 {. C/ J- 原始类型 之一
- 或 复合类型
# g* U* ]; m e) A5 Q/ q. [ U# Y. o. m" P# ` O
此外,这些类型中的许多类型可以变为空值。0 ?6 H7 H: p! V. c# E1 h: x; `1 I8 m5 U) I
& O# U& ^3 L& w
原始类型
( _( i. [4 X x, J4 S1 B% aTact 支持许多专为智能合约定制的原始数据类型:
N. z+ r2 `+ V) |: ?0 d0 D$ i
( B- `8 x$ C+ A1 `. Q- Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
- Bool — 经典布尔类型,具有 true 和 false 值。
- Address — TON 区块链中的标准智能合约地址。
- Cell、Builder、Slice — TVM 的底层基元。
- String — 不可变的文本字符串。
- StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。
, B# D5 K+ U, U3 {
- z- R9 O) t5 i& C9 H6 g: G9 v8 W W7 i0 X4 [" ^% L" h0 Y0 y
: Y3 ?5 k5 f8 z( h- s
布尔值
$ t: {. D4 F: m) H: Y$ v4 A0 b5 F& ]
原始类型 Bool 是经典的布尔类型,只能容纳两个值:true 和 false。它便于布尔和逻辑运算,也便于存储标志。 它便于布尔和逻辑运算,也便于存储标志。9 [+ X: M5 l; y/ W& c
$ Z9 v7 q- o. Y! A$ t
Tact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如: 这里有许多比较运算符,例如:
7 y' ^0 c+ g$ K3 {+ e# D: p; e1 d9 O6 y
- && 为 logical AND
- || 为 logical OR
- ! 为 logical inversion
- == 和 != 用于检查相等
- ! 表示非空断言 o [: y# a" B9 D0 h4 r, X. J
: {; |2 o# \$ H0 p+ @
将布尔值持久化到状态中非常节省空间,因为它们只占用1位。 在状态中存储 1000 个布尔值每年大约花费 ' ]- t! w1 `- O% ?2 m
0.00072
# T; u) \. u. b1 Z2 e9 z I2 G0.00072 TON。
9 K4 V# X7 E$ W1 ?4 J
" N2 `$ _; h) g' H: S4 @
+ x, ^! \8 q0 v6 o. y) v# Y9 L w' l
复合类型* r, \+ G, e( ]+ U% Q( h) h+ p g
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:
( V$ l: }0 a7 Q. U K2 o* ~! B7 \' x" Z4 i8 d5 v
" E- K$ G( i6 r& N6 [7 ^
- Maps - 键与值的关联。
- 复合类型,如结构体和消息
- 可选项 - 结构体和消息变量或字段的null值。
X( ~& _$ Y, y) y: _; c0 m 0 G$ k4 @9 }8 b- v
+ y& E1 F+ {- D+ l
: m! a& f: H: q8 M; q1 \% F. |- a- |( j4 I; z( x% m( p0 L( e
除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在回退消息接收器(bounced message receivers)中指定。
4 a; y9 I) S* e/ R, Z+ o: K+ }7 D$ w7 r
请注意,虽然合约和trait也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。 相反,我们可以使用 initOf表达式来获取给定合约的初始状态。% k2 j+ j* k) d1 _
: P3 @$ ~" }3 M, U. u5 ?8 L7 _) d ~$ R- A3 c, Q$ I( B
Maps: |7 D) W" e D+ w+ f
类型map<K, V>用于将类型K的键与类型V的相应值关联起来。
" V0 U+ t- c+ @- n' [+ b) T7 m% @9 T' n) N$ |
示例map<K, V>
" b1 [. y9 `7 @2 r- o' v- let mapExample: map<Int, Int> = emptyMap(); // empty map with Int keys and values
复制代码 2 G! s0 G6 n6 K# b2 ?, }* g
* i/ [, Z1 R6 L1 H* O y/ A3 r* W( a# i5 X* h9 G( b4 a: ?
* \6 e+ h2 F/ [- b+ g9 ?结构和消息
8 X8 r( H, X3 f& Q" g结构和消息是将多个原始类型组合成复合类型的两种主要方式。
+ }; x8 a/ M) z7 g; }; H, g0 i' T" D) _6 d
Struct 示例:
+ K/ m5 c" o; \& K' D6 W- struct Point {3 Q: U4 I: I3 }! n8 y# D$ M
- x: Int; y }2 d$ i) m7 q8 U# L2 D
- y: Int;
! T. X2 H4 x0 C6 y - }
复制代码 Message 示例:3 A1 \) n- O, l- n S/ `* H
- // Custom numeric id of the Message
, T$ x; l/ L6 H& ~ - message(0x11111111) SetValue {* d* x( H% @# g. ~/ ]7 {0 u; s2 v
- key: Int;) n/ D- v' n2 _5 k; T, v
- value: Int?; // Optional, Int or null
. \ W4 `& e* m8 F: d" [0 [* M - coins: Int as coins; // Serialization into TL-B types- L- y2 Y9 ~" m0 | Y( w
- }
复制代码- let opt: Int? = null; // Int or null, with explicitly assigned null
复制代码 在专门页面了解更多信息:可选项。5 g$ c v0 S+ ~7 i( R8 g
' V C0 S; s8 u) S, o
7 S3 j* O% e6 m) u% q合约
8 M( S% n* D6 R" r0 a0 i u- wTON区块链上的合约在Tact中作为智能合约的主要入口。 它包含了一个TON合约的所有functions、getters和receivers等多种内容。1 x3 y' F5 [8 H
& p2 o! S* a6 l m- i
合约示例:* D! h+ D$ M, @& y; W1 b7 w. L
* m8 M. W0 [6 ^; A4 X9 l
- contract HelloWorld {
2 x7 S/ |2 _$ \. u - // Persistent state variable4 S+ W) y$ `' O5 i$ [5 h
- counter: Int;
: c3 y9 p0 X9 j/ z
. W/ `6 G5 l' Q! Q; u- // Constructor function init(), where all the variables are initialized
& `8 i _8 z- p$ J0 j8 P - init() {
8 W, x, a* y( H - self.counter = 0;
9 p2 G0 O7 r* R0 _: E. s! O - }5 M5 n1 u/ F/ b( P* F e. N# X) Y( n
- 6 j1 m5 L2 L5 a
- // Internal message receiver, which responds to a string message "increment"
; X' k4 ?- U( M* M - receive("increment") {8 n6 \# c1 E" J; R
- self.counter += 1;+ J& ~; B6 H, M
- }
" ]% \9 {, x$ o$ x# R - ' d% V* w5 N2 b
- // Getter function with return type Int
4 M9 L; ]: M" D1 ]; q - get fun counter(): Int {
) N: n3 s. `! ^) E - return self.counter;) w3 ^/ U/ @% S& l
- }
2 C, Z, e# {; G - }
复制代码- trait Ownable {
; G2 S7 [) a# |& \% e' c& w9 T - // Persistent state variable, which cannot be initialized in the trait' Y2 c9 {- j' X: f y
- owner: Address;' S9 r* o- f" ]$ H
/ A1 j L- d( ]: J1 r! Q% A1 k- // Internal function' e$ ~9 ^1 {: p- V" _: S. O, h+ o* ^
- fun requireOwner() {3 G: o! @& J( a# c& d I
- throwUnless(132, context().sender == self.owner);
* I! N: O/ Q, Z7 H# m; M$ Q6 K$ z - }6 U; D2 [) u# N# h: X9 \+ m% a
4 x. z% M8 \! M) K2 s- // Getter function with return type Address
" e2 E9 j* m; k% l' E - get fun owner(): Address {5 K0 e* U/ f ]* m
- return self.owner;
3 P, V) K- {- n( `' ]4 L% M - }
/ j4 m. A" y6 L7 x) v2 y5 t - }
复制代码 5 f; z( B4 a1 w2 u" u, ]2 x1 B
5 o$ h. `& t0 N: ?5 f; F; H
7 m- V. ~& @- z# |/ E# @8 \( ] |
|