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

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

回答

收藏

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

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

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
  1. 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
  1. struct Point {8 i7 t! U# b0 R. u- {+ K
  2.     x: Int;
    * k: ?# n4 Z4 J& l0 S  ~
  3.     y: Int;1 e% i8 G" ~8 g/ W
  4. }
复制代码
Message 示例:8 }; v0 V# G# M, d( |
  1. // Custom numeric id of the Message. A% p5 x' p4 `
  2. message(0x11111111) SetValue {. Y+ T# C. c1 z$ m$ @" u8 N) q) d
  3.     key: Int;7 u& G2 h; Z8 ]
  4.     value: Int?; // Optional, Int or null
    / D3 D; _% a7 r. ?" g- a
  5.     coins: Int as coins; // Serialization into TL-B types
      t% \* q7 v* \! w
  6. }
复制代码
  1. 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
  1. contract HelloWorld {
    * A& G! X8 M* M8 X5 e' v
  2.     // Persistent state variable
    2 w/ |, g" q0 m( N! I6 x) ]9 n8 N6 g
  3.     counter: Int;
      X# r4 b; k; F" l( |

  4. ' i* r9 o7 [5 N& X
  5.     // Constructor function init(), where all the variables are initialized' W3 g3 x- t8 c
  6.     init() {& ~8 \; H/ H3 D, a% O) Z8 G8 h* n
  7.         self.counter = 0;
    % [4 D2 ]( ]0 E# G2 k! X
  8.     }
      N. H3 S! A4 l* m

  9. # p4 `, W' o6 r2 x# x- W4 R
  10.     // Internal message receiver, which responds to a string message "increment"
    ! g. w0 m' X& N( T6 N* C
  11.     receive("increment") {
    5 I; Z& K6 c# U1 [) i, G- M/ S
  12.         self.counter += 1;
    / |3 }! ^( @( Q" D' P, }% ?
  13.     }
      z, r& a+ E. C) x0 Q
  14. 2 T! ~# B+ e5 A. V. N
  15.     // Getter function with return type Int, Y  E; f: R  h4 Q+ O
  16.     get fun counter(): Int {
    ; S8 ]* |' k& P; R! A
  17.         return self.counter;
    0 f5 ?6 X+ }- S1 b7 J5 A
  18.     }
    & ~) N$ a2 D4 {: p6 l/ t: T" o
  19. }
复制代码
  1. trait Ownable {; k+ ?5 d3 \9 M* K  u( f
  2.     // Persistent state variable, which cannot be initialized in the trait
      l0 z% ]% {8 \- f; H" p
  3.     owner: Address;
    8 `2 D, l% m  _& y+ F
  4. / u  O# c5 v" }/ e3 o# ]  |
  5.     // Internal function
    1 d* z2 {/ D- \3 @& k9 O( ]
  6.     fun requireOwner() {0 c0 @( f$ b- @
  7.         throwUnless(132, context().sender == self.owner);# L5 I( B% J. }( C; G1 ~
  8.     }' C# R/ I3 Q1 h7 v% A3 Q6 L# q
  9. ; U- J$ k3 p0 l- X: c  c( `8 J
  10.     // Getter function with return type Address+ O% o/ ~; M- ~
  11.     get fun owner(): Address {
    0 y2 v3 l2 c7 @* B: T9 u
  12.         return self.owner;' Z* I3 r# M$ w
  13.     }2 h& G" C. Z/ p
  14. }
复制代码
. K% u2 y9 _( k+ z: C
/ \/ Q* P# y/ p# ^  x$ m
9 j( h- o0 }9 \. I
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则