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

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

回答

收藏

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

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

Tact 程序中的每个变量、项目和值都有一个类型。 它们可以是
, W1 }, t$ s2 a" t, P9 \3 F% q. W. Y9 w) n" r
  • 原始类型 之一
  • 或 复合类型
    ) P. l1 W; H' T: C& E

3 K% ?& [1 v" |& i# K- w' V# {此外,这些类型中的许多类型可以变为空值。
  o. y  X& {% w3 L: N: ?2 O+ H1 k
4 e3 p& Z: `, T, j+ n原始类型
; d: F* c9 y) d( ?( ~+ STact 支持许多专为智能合约定制的原始数据类型:* Z: L* l2 K8 y: m6 t' S
9 s8 ^3 A" a' h: i3 S. `+ C6 U
  • Int — Tact 中的所有数字都是 257 位有符号整数,但可以使用较小的表示方法来减少存储成本。
  • Bool — 经典布尔类型,具有 true 和 false 值。
  • Address — TON 区块链中的标准智能合约地址。
  • Cell、Builder、Slice — TVM 的底层基元。
  • String — 不可变的文本字符串。
  • StringBuilder — 辅助类型,允许以节省 gas 的方式连接字符串。
    6 }' H8 X$ o- w: v: ?4 d( Z- \

9 M! a: N3 ~* j3 c( L/ H4 v
" |& t6 z( n9 }( A8 G; T1 |- b1 ~; l+ V8 v# d! g9 b+ b/ p" ^# _
布尔值+ ]7 ]) D& D$ o' c- A- j5 ]

! C: X9 m0 L! \& h4 `原始类型 Bool 是经典的布尔类型,只能容纳两个值:true 和 false。它便于布尔和逻辑运算,也便于存储标志。 它便于布尔和逻辑运算,也便于存储标志。
7 g" q# L/ Y4 a/ `! c4 B0 D, D
$ J8 e0 f4 t* p0 L% ]Tact 中没有隐式类型转换,因此两个布尔值的加法(+)是不可能的。这里有许多比较运算符,例如: 这里有许多比较运算符,例如:
8 [$ c# z' H; F6 z# z  M8 k8 g6 M
# `6 G8 F6 O' f; S# z9 P
  • && 为 logical AND
  • || 为 logical OR
  • ! 为 logical inversion
  • == 和 != 用于检查相等
  • ! 表示非空断言* P4 K/ M$ l5 W% C' r! R
! Y1 S+ w. {; G/ U! ]
将布尔值持久化到状态中非常节省空间,因为它们只占用1位。 在状态中存储 1000 个布尔值每年大约花费
5 w" X2 P: n4 u, q& g; p0.00072
3 U/ ~6 r6 G0 z# ~2 I. v' O& O1 C6 ^0.00072 TON。
% c& {. {  I7 M+ O  e7 A8 t
8 h( r2 ^/ V/ E2 a0 s' g# B/ G
0 C8 `# S' w# X( f- v, _; g& }0 v5 C! o2 V9 ]" _
复合类型! X0 J: m  D: w% z- p
使用单独的存储手段往往会变得繁琐,因此有办法将多个原始类型组合在一起,创建复合类型:3 }( s0 p: d1 V- O) A" \

$ i: g0 p5 |% Q9 u2 w3 |. D( X3 Y% x, o( S
  • Maps - 键与值的关联。
  • 复合类型,如结构体和消息
  • 可选项 - 结构体和消息变量或字段的null值。
    - G) X0 \7 `& l* C5 Q* _4 R' P
1 u9 H1 B. ^  w* X7 L; d0 c
4 A& j1 p0 M7 ?) `. I" k5 R) q% N
! @% o& E0 c3 i: a& J

0 K  ]; `5 G) j% e) x7 w9 D. e! @( j除上述复合类型外,Tact 还提供了一种特殊的类型构造函数bounced<T>,它只能在回退消息接收器(bounced message receivers)中指定。
5 g- M4 E; u9 T8 K# I& ]$ c! w$ K7 P: O* d
请注意,虽然合约和trait也被视为Tact类型系统的一部分,但我们不能像结构体和消息那样传递它们。 相反,我们可以使用 initOf表达式来获取给定合约的初始状态。, i# {; A3 s# _6 t# u  X) L1 _: i
6 v  ]% o$ k$ V

/ `. Q5 e7 ?# T- eMaps
8 H9 u5 x5 U6 ~3 r类型map<K, V>用于将类型K的键与类型V的相应值关联起来。" W# M- W/ h) R

, a4 A. L  Z. V. z& O, o; M4 t示例map<K, V>) `* O) e8 a* E/ w0 Q) @
  1. let mapExample: map<Int, Int> = emptyMap(); // empty map with Int keys and values
复制代码
1 G& l& f- r; t" d2 y0 z
, H. e+ D/ @3 }" c; {8 `5 P% I
; ^9 O" C  l7 U. Y+ p# s. a0 K

9 H0 }- N2 C& ]% p. B结构和消息
+ j- ?) R1 O$ _& M4 o结构和消息是将多个原始类型组合成复合类型的两种主要方式。9 Z& y+ `* ?/ D

6 x& C: F; u  X: aStruct 示例:2 J2 y! G+ s9 c
  1. struct Point {% h. `( q5 ^2 w- |. d
  2.     x: Int;
    2 W' Q' s  r" E2 ?( b
  3.     y: Int;
    1 J3 S/ O# G* P- {
  4. }
复制代码
Message 示例:2 f9 G' f3 R# D& s5 M. b
  1. // Custom numeric id of the Message
    : h! }: E9 \$ {3 F
  2. message(0x11111111) SetValue {
    8 y5 f3 P1 D/ ^  S) J
  3.     key: Int;6 l* J; G  q1 P
  4.     value: Int?; // Optional, Int or null
    / v0 x# G) ^+ T7 a# K& J
  5.     coins: Int as coins; // Serialization into TL-B types# J, g, y" B  w+ B6 \  g
  6. }
复制代码
  1. let opt: Int? = null; // Int or null, with explicitly assigned null
复制代码
在专门页面了解更多信息:可选项。. p/ o" M0 @* Q" x; a  V$ a( X
+ f5 f5 T( g" k3 ^" m$ \" S0 }
0 d: W* j3 b& t( e
合约
3 ]1 Z" S# E* ~3 O0 cTON区块链上的合约在Tact中作为智能合约的主要入口。 它包含了一个TON合约的所有functions、getters和receivers等多种内容。
8 a* N. x1 a1 E  V4 G) e3 g2 `  f4 h2 }4 {
合约示例- V$ Y+ h; X: ]1 {

/ m" C, A+ ^( I1 n# L2 X0 f8 q
  1. contract HelloWorld {& S7 [( ?( _: |/ t* ^* `& B. _
  2.     // Persistent state variable
      D3 K1 a/ i7 M: O. H9 w9 t
  3.     counter: Int;
    * _8 D% {8 I. D3 J$ r

  4. 9 F+ u* q& J- ^, A. t
  5.     // Constructor function init(), where all the variables are initialized( x& }7 r, Z7 i: Z) q+ r
  6.     init() {
    2 R9 \9 x! I5 y9 {' ]
  7.         self.counter = 0;
    ) N! K0 j/ P2 \$ `# p  {+ w/ w0 K
  8.     }$ T9 q  a& h, A5 `8 h* G
  9. 4 y: @1 b9 j: S, W3 E6 f
  10.     // Internal message receiver, which responds to a string message "increment"- b1 W* {. Z, \$ l$ q
  11.     receive("increment") {* }7 X* h% b1 ^' G# d1 }
  12.         self.counter += 1;. e8 x6 K2 f- B, u, n; H
  13.     }" e9 E" p& f) w& d6 T  {
  14. 8 N$ }& b: A, z9 N! ?1 Z7 v3 f
  15.     // Getter function with return type Int
    ! B( x1 q6 \- t/ _1 F
  16.     get fun counter(): Int {$ t, H6 r( P$ r& b$ r
  17.         return self.counter;# t5 q- @7 R3 _1 r8 J4 w- a
  18.     }
    9 `4 \! V0 ]" ]$ T! e2 v
  19. }
复制代码
  1. trait Ownable {
    # I( q% [0 O( m- r
  2.     // Persistent state variable, which cannot be initialized in the trait( ~  r+ v8 O& |6 R+ Z5 y" S
  3.     owner: Address;# V: N/ ]) O% U

  4. $ g5 j- L" |% S
  5.     // Internal function
    7 H# ?# M$ N5 j! E) r. |& ~
  6.     fun requireOwner() {9 E& p& M# c6 V' K
  7.         throwUnless(132, context().sender == self.owner);  d3 b2 w; a) B- P. X, B- h+ L% Y4 R
  8.     }5 q8 U4 Y& E9 [& }8 Y9 ]) w) x
  9. % X( G; Z/ q3 e: p1 V6 D7 n
  10.     // Getter function with return type Address5 W" c: t4 R7 M$ ^9 E, l
  11.     get fun owner(): Address {
    0 [, v0 G% n' x8 _9 q' F4 Z
  12.         return self.owner;) Y" ^) B  y3 D% M. U' \: O( _0 H
  13.     }% i% m# g* U) Q
  14. }
复制代码

( U! S0 x% L8 B+ j- v& E1 O5 g7 D) N" q7 w' N

+ w* X0 }" n- j( Z: d
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则