|
Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是) }. R$ h+ T4 ~1 p( }- m; [
5 A4 q6 w: C u( ]: @
- 原始类型 之一
- 或 复合类型$ \) d* y1 _* B- _
% ^7 n+ V) x4 F/ o
此外,这些类型中的许多类型可以变为空值。
: H% f9 e/ y' S" Z8 P! `
f3 R3 N" P6 t: Y( ]. q' M# V; M& [原始类型, Y# E" r1 M J( L: a/ R6 \3 @
Tact 支持许多专为智能合约定制的原始数据类型:8 t2 q2 |9 k0 M7 t" K
0 U. m% d5 W V- M5 V. G
- Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
- Bool — 经典布尔类型,具有 true 和 false 值。
- Address — TON 区块链中的标准智能合约地址。
- Cell、Builder、Slice — TVM 的底层基元。
- String — 不可变的文本字符串。
- StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。 e1 M0 { G6 o/ F
$ X: T+ M1 U1 m! G# p
% G$ m# v) ]) Z. O
, [, Q% H5 [; w# @% ]布尔值
6 P# d8 I9 W( V" b9 `. o+ G
( |6 I! |0 {# Y* k$ e原始类型 Bool 是经典的布尔类型,只能容纳两个值:true 和 false。它便于布尔和逻辑运算,也便于存储标志。 它便于布尔和逻辑运算,也便于存储标志。
+ g5 N2 b6 d, h# O
' j3 ?- c# }3 |* }- e3 l9 j) xTact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如: 这里有许多比较运算符,例如:
0 J0 Y( r2 v( G( o! b! p; X7 M$ Y6 S( w) I/ f7 h1 w6 Z4 X: ~1 E. X
- && 为 logical AND
- || 为 logical OR
- ! 为 logical inversion
- == 和 != 用于检查相等
- ! 表示非空断言
& C' w: [3 N1 H. z% N
$ D5 t; b) N1 X& v; Z将布尔值持久化到状态中非常节省空间,因为它们只占用1位。 在状态中存储 1000 个布尔值每年大约花费
3 w4 L: r1 y8 f6 k, n0.00072
3 N/ g: D, m3 ]# Y+ o/ P+ t. a8 t0.00072 TON。
) A4 z- |4 J8 i+ Z
5 ]" _1 _$ ^6 O% x) f6 p: H" |" j% i2 f3 s
; q ]- Q9 S4 @7 U- F- F" Y复合类型7 q% J; t& g* ^/ p' K
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:$ P# O2 x( a, s+ d
+ F% a3 D$ J1 J
+ t! @# v7 b# \% T* y
- Maps - 键与值的关联。
- 复合类型,如结构体和消息
- 可选项 - 结构体和消息变量或字段的null值。7 p; n5 O. l0 m, M4 ~) u m6 p, r( W7 W
i- | P; f1 k7 b$ e K& R1 z" i2 J7 a3 x4 r5 i( V
p* L g3 M' x) O3 ^
6 \2 f* _. U2 F) e8 i除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在回退消息接收器(bounced message receivers)中指定。/ S) \$ |8 ], n* b- N1 l
; ]+ _. w1 d* q% D, G3 Y" j请注意,虽然合约和trait也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。 相反,我们可以使用 initOf表达式来获取给定合约的初始状态。
3 t/ Z+ X! ~ h# D: m* j ]- H: p5 c8 k. L; \: L' b b8 Q1 j
2 K$ c+ q# s% ^
Maps# R3 J- }* Y4 z5 t# X) t! M6 h+ [& c7 f/ c
类型map<K, V>用于将类型K的键与类型V的相应值关联起来。
. N. t. C8 V/ s" m* d+ g, w. n$ U4 Y8 o3 ~2 b" I, E
示例map<K, V>
8 k) N1 A4 B q( d- let mapExample: map<Int, Int> = emptyMap(); // empty map with Int keys and values
复制代码 4 \7 }* s& u7 S8 M9 r, P; P
$ C# ^. S7 P& w; `- p8 h
% G0 Y; s* _: H% V
7 `) G: V; \, v! a1 W结构和消息
; l) D: r0 X7 U3 o2 a结构和消息是将多个原始类型组合成复合类型的两种主要方式。
' G2 r! J8 O$ ` J, X( P7 m" f0 A1 W* B4 J6 [/ G, e4 v
Struct 示例:
7 F0 V* p- f2 E6 }1 K- y" n- struct Point {, `% b2 c' V8 r" U8 ^6 e2 B
- x: Int;6 g3 A: m* {8 z: _, y2 y+ l+ M2 z
- y: Int;
2 F$ @9 M4 K- n6 l5 p - }
复制代码 Message 示例:
- v3 D" o# [( p- // Custom numeric id of the Message4 i& i0 u8 J$ L" ^
- message(0x11111111) SetValue {
* D$ y) f; e1 r& s. `0 Z - key: Int;
7 p' c' n- O: f% { - value: Int?; // Optional, Int or null
: m1 ]& w5 ~/ L, U/ a" D% g8 h' F - coins: Int as coins; // Serialization into TL-B types
+ ?9 E. b# E1 `( ~/ s9 D7 G H - }
复制代码- let opt: Int? = null; // Int or null, with explicitly assigned null
复制代码 在专门页面了解更多信息:可选项。
! t2 p5 L+ |6 Y1 @! V, Z
9 g9 u" }& ~$ i K4 }- [/ ]
: K3 G4 o8 n# k; c合约3 O* Q4 g: |8 L; f8 k$ q( L
TON区块链上的合约在Tact中作为智能合约的主要入口。 它包含了一个TON合约的所有functions、getters和receivers等多种内容。
$ f& d2 R0 `+ l* {9 P; K5 e9 k3 h, K% y6 G( C6 W2 p0 d
合约示例:8 U5 p {9 Y6 y* b) v- P
" y5 `' F3 _1 [* ^0 t0 {; i; w- contract HelloWorld {2 Z/ }4 x: V, n2 y$ g% I- l) E7 g
- // Persistent state variable
2 v; v* e' z8 v j3 d8 Z - counter: Int;
$ |8 a1 X* u9 l, W
0 r4 k! Y* C7 ^' w# r0 h7 J6 W7 d- // Constructor function init(), where all the variables are initialized7 x) x" y, J+ z2 g8 r3 t" q! D
- init() {2 P5 M1 W9 _% q2 n* x# F
- self.counter = 0;
. w* e w# o( d1 C/ d2 ] - }
* c6 y( d7 P4 Q2 p: |
: }* H5 ?! ]& }6 h- // Internal message receiver, which responds to a string message "increment"
6 E9 `5 V* Z9 H+ A* h M# n1 b; _" K - receive("increment") {) t3 _3 J( n4 U/ x
- self.counter += 1;
/ I8 n% W: }5 \5 v) F- O - }4 e& @0 }, x0 T* j& f* t8 m; ^
- # ? H) k) N Q9 I, ?- S
- // Getter function with return type Int
* p4 X3 f$ C7 v, ? - get fun counter(): Int {- W0 e' }, I* A L3 n2 b/ \7 m
- return self.counter;
- H1 t0 k2 F" v1 O, J! l - }$ v4 j2 h* ]5 R( Q# @7 ^
- }
复制代码- trait Ownable {
& k9 T3 M; A1 \: j% R9 f - // Persistent state variable, which cannot be initialized in the trait7 ~1 `8 f. r7 P" w9 M' _: b& b
- owner: Address;) d) g: o. G, F6 X8 v' q
- . I$ N7 E9 [: W; ]' M/ s
- // Internal function6 s& B% A4 f) J/ x5 ~; x
- fun requireOwner() {
% `( i2 w! P; J4 C U0 ^% t ^ - throwUnless(132, context().sender == self.owner);, `/ n0 m* W! B& {
- }
# a* h) ]% n" ]+ T$ j% |8 k3 x
4 j$ w+ c( W/ e7 ~0 I- // Getter function with return type Address
& ?9 T$ w3 u7 H - get fun owner(): Address {
& j/ ^! C3 v+ A; {- s& f; G. m) Y - return self.owner;% D, g$ ~. Y. n; V: n
- }- q4 _* ?/ h/ R Q3 p) n
- }
复制代码 * w& c/ e0 ~ H8 G) x ]( t5 y0 ?
# H y2 q `) C: l) g, A* @ S1 i* d2 E" R
|
|