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

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

回答

收藏

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

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

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
  1. 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
  1. struct Point {, `% b2 c' V8 r" U8 ^6 e2 B
  2.     x: Int;6 g3 A: m* {8 z: _, y2 y+ l+ M2 z
  3.     y: Int;
    2 F$ @9 M4 K- n6 l5 p
  4. }
复制代码
Message 示例:
- v3 D" o# [( p
  1. // Custom numeric id of the Message4 i& i0 u8 J$ L" ^
  2. message(0x11111111) SetValue {
    * D$ y) f; e1 r& s. `0 Z
  3.     key: Int;
    7 p' c' n- O: f% {
  4.     value: Int?; // Optional, Int or null
    : m1 ]& w5 ~/ L, U/ a" D% g8 h' F
  5.     coins: Int as coins; // Serialization into TL-B types
    + ?9 E. b# E1 `( ~/ s9 D7 G  H
  6. }
复制代码
  1. 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
  1. contract HelloWorld {2 Z/ }4 x: V, n2 y$ g% I- l) E7 g
  2.     // Persistent state variable
    2 v; v* e' z8 v  j3 d8 Z
  3.     counter: Int;
    $ |8 a1 X* u9 l, W

  4. 0 r4 k! Y* C7 ^' w# r0 h7 J6 W7 d
  5.     // Constructor function init(), where all the variables are initialized7 x) x" y, J+ z2 g8 r3 t" q! D
  6.     init() {2 P5 M1 W9 _% q2 n* x# F
  7.         self.counter = 0;
    . w* e  w# o( d1 C/ d2 ]
  8.     }
    * c6 y( d7 P4 Q2 p: |

  9. : }* H5 ?! ]& }6 h
  10.     // Internal message receiver, which responds to a string message "increment"
    6 E9 `5 V* Z9 H+ A* h  M# n1 b; _" K
  11.     receive("increment") {) t3 _3 J( n4 U/ x
  12.         self.counter += 1;
    / I8 n% W: }5 \5 v) F- O
  13.     }4 e& @0 }, x0 T* j& f* t8 m; ^
  14. # ?  H) k) N  Q9 I, ?- S
  15.     // Getter function with return type Int
    * p4 X3 f$ C7 v, ?
  16.     get fun counter(): Int {- W0 e' }, I* A  L3 n2 b/ \7 m
  17.         return self.counter;
    - H1 t0 k2 F" v1 O, J! l
  18.     }$ v4 j2 h* ]5 R( Q# @7 ^
  19. }
复制代码
  1. trait Ownable {
    & k9 T3 M; A1 \: j% R9 f
  2.     // Persistent state variable, which cannot be initialized in the trait7 ~1 `8 f. r7 P" w9 M' _: b& b
  3.     owner: Address;) d) g: o. G, F6 X8 v' q
  4. . I$ N7 E9 [: W; ]' M/ s
  5.     // Internal function6 s& B% A4 f) J/ x5 ~; x
  6.     fun requireOwner() {
    % `( i2 w! P; J4 C  U0 ^% t  ^
  7.         throwUnless(132, context().sender == self.owner);, `/ n0 m* W! B& {
  8.     }
    # a* h) ]% n" ]+ T$ j% |8 k3 x

  9. 4 j$ w+ c( W/ e7 ~0 I
  10.     // Getter function with return type Address
    & ?9 T$ w3 u7 H
  11.     get fun owner(): Address {
    & j/ ^! C3 v+ A; {- s& f; G. m) Y
  12.         return self.owner;% D, g$ ~. Y. n; V: n
  13.     }- q4 _* ?/ h/ R  Q3 p) n
  14. }
复制代码
* w& c/ e0 ~  H8 G) x  ]( t5 y0 ?

# H  y2 q  `) C: l) g, A* @  S1 i* d2 E" R
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则