English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE คนไทย Français русский

回答

收藏

Tact 语言基础 | 类型系统概述

开源社区 开源社区 5902 人阅读 | 0 人回复 | 2025-03-23

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
  1. 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
  1. struct Point {/ X* x# r$ b) g4 e& k0 X  T# I3 t
  2.     x: Int;
    . i; ]- P- h$ j0 v" w
  3.     y: Int;+ I$ X6 }3 b" i' X2 u1 y
  4. }
复制代码
Message 示例:. i$ }  |2 b0 j: x$ }2 ]
  1. // Custom numeric id of the Message
    : \" X# m$ d, w( C) L
  2. message(0x11111111) SetValue {
    / M8 U9 a7 O3 S# _
  3.     key: Int;" O3 x4 L& S8 d# V/ X+ Y; O  {
  4.     value: Int?; // Optional, Int or null( Z4 U1 q" ]/ e) U# C
  5.     coins: Int as coins; // Serialization into TL-B types
    % p7 T2 h5 o% h
  6. }
复制代码
  1. 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
  1. contract HelloWorld {0 t1 m4 J% |0 B* u6 C( L
  2.     // Persistent state variable
    6 i' D5 ], j2 w1 x: X' x# j1 h( s
  3.     counter: Int;
    1 z+ x& ?5 S3 M. y8 g5 m
  4. - Z' t( q% L' V  h! S9 h& G$ N- h
  5.     // Constructor function init(), where all the variables are initialized
      k1 q7 R; B/ ], O9 s$ R- m
  6.     init() {
    1 v& K1 |* \; O, i# u
  7.         self.counter = 0;
    - N+ q/ u5 C5 H* R
  8.     }# k5 N* E$ [) M+ d% V. v
  9. * v' L$ n6 _% w, ]4 `6 e5 [5 ]
  10.     // Internal message receiver, which responds to a string message "increment"" ?* I; n* U) [2 _
  11.     receive("increment") {7 b0 o0 h* a' s% Z6 b& @1 w
  12.         self.counter += 1;: y4 `4 K- J9 y$ v, c) P9 a5 q4 S
  13.     }# r7 z% }$ Q% `" ^
  14. ( W  d$ l% h! m- d
  15.     // Getter function with return type Int. p- e% O$ P) k/ I3 L7 |1 ~
  16.     get fun counter(): Int {
    - x7 N4 K/ Y8 i+ T
  17.         return self.counter;* U5 i2 I$ V: c# j. a9 J; G
  18.     }1 `( e& ]& G$ o1 X- h( A
  19. }
复制代码
  1. trait Ownable {
    1 j$ N* A- z6 W' i# h
  2.     // Persistent state variable, which cannot be initialized in the trait5 y+ |) w/ p3 Q
  3.     owner: Address;- }% f' D, J6 H4 f5 c0 h' X
  4. - D& x& x4 Z2 i/ g$ c3 t- ~" ~, o
  5.     // Internal function, b' h0 ?5 `" g+ ^4 q
  6.     fun requireOwner() {. B! q# L. W; ]  u$ b, W( j
  7.         throwUnless(132, context().sender == self.owner);9 w2 Z) M. L4 y+ D% U
  8.     }
    + b6 l( r0 n/ P
  9. ( X, b, W/ p! K5 r
  10.     // Getter function with return type Address
    . Q. L& m. X4 ^
  11.     get fun owner(): Address {' }% Z5 L9 y) @. H# X
  12.         return self.owner;2 X. s. o0 s( b* |( I2 d
  13.     }2 t' e. J8 I' M" v" O% g' z, V' i
  14. }
复制代码
! 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& `
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则