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

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

回答

收藏

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

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

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
  1. 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
  1. struct Point {3 Q: U4 I: I3 }! n8 y# D$ M
  2.     x: Int;  y  }2 d$ i) m7 q8 U# L2 D
  3.     y: Int;
    ! T. X2 H4 x0 C6 y
  4. }
复制代码
Message 示例:3 A1 \) n- O, l- n  S/ `* H
  1. // Custom numeric id of the Message
    , T$ x; l/ L6 H& ~
  2. message(0x11111111) SetValue {* d* x( H% @# g. ~/ ]7 {0 u; s2 v
  3.     key: Int;) n/ D- v' n2 _5 k; T, v
  4.     value: Int?; // Optional, Int or null
    . \  W4 `& e* m8 F: d" [0 [* M
  5.     coins: Int as coins; // Serialization into TL-B types- L- y2 Y9 ~" m0 |  Y( w
  6. }
复制代码
  1. 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
  1. contract HelloWorld {
    2 x7 S/ |2 _$ \. u
  2.     // Persistent state variable4 S+ W) y$ `' O5 i$ [5 h
  3.     counter: Int;
    : c3 y9 p0 X9 j/ z

  4. . W/ `6 G5 l' Q! Q; u
  5.     // Constructor function init(), where all the variables are initialized
    & `8 i  _8 z- p$ J0 j8 P
  6.     init() {
    8 W, x, a* y( H
  7.         self.counter = 0;
    9 p2 G0 O7 r* R0 _: E. s! O
  8.     }5 M5 n1 u/ F/ b( P* F  e. N# X) Y( n
  9. 6 j1 m5 L2 L5 a
  10.     // Internal message receiver, which responds to a string message "increment"
    ; X' k4 ?- U( M* M
  11.     receive("increment") {8 n6 \# c1 E" J; R
  12.         self.counter += 1;+ J& ~; B6 H, M
  13.     }
    " ]% \9 {, x$ o$ x# R
  14. ' d% V* w5 N2 b
  15.     // Getter function with return type Int
    4 M9 L; ]: M" D1 ]; q
  16.     get fun counter(): Int {
    ) N: n3 s. `! ^) E
  17.         return self.counter;) w3 ^/ U/ @% S& l
  18.     }
    2 C, Z, e# {; G
  19. }
复制代码
  1. trait Ownable {
    ; G2 S7 [) a# |& \% e' c& w9 T
  2.     // Persistent state variable, which cannot be initialized in the trait' Y2 c9 {- j' X: f  y
  3.     owner: Address;' S9 r* o- f" ]$ H

  4. / A1 j  L- d( ]: J1 r! Q% A1 k
  5.     // Internal function' e$ ~9 ^1 {: p- V" _: S. O, h+ o* ^
  6.     fun requireOwner() {3 G: o! @& J( a# c& d  I
  7.         throwUnless(132, context().sender == self.owner);
    * I! N: O/ Q, Z7 H# m; M$ Q6 K$ z
  8.     }6 U; D2 [) u# N# h: X9 \+ m% a

  9. 4 x. z% M8 \! M) K2 s
  10.     // Getter function with return type Address
    " e2 E9 j* m; k% l' E
  11.     get fun owner(): Address {5 K0 e* U/ f  ]* m
  12.         return self.owner;
    3 P, V) K- {- n( `' ]4 L% M
  13.     }
    / j4 m. A" y6 L7 x) v2 y5 t
  14. }
复制代码
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 \( ]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则