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

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

回答

收藏

Tact 语言基础| 可选项

开源社区 开源社区 9745 人阅读 | 0 人回复 | 2025-04-01

本帖最后由 riyad 于 2025-4-1 20:01 编辑
9 Q) o+ a0 b5 h- }7 C& ^/ [( L
# d& N1 T1 Q9 A8 v, K6 t: b' E8 u* [类型系统概述中提到,所有原始类型、结构体和消息都可以为空。 也就是说,它们不一定有任何值,除了 null —— 一个特殊的值,表示故意缺少任何其他值。* I9 S7 M: P  h3 y$ |
7 _" Y3 h  C" P- h: A- B  W
变量或结构和消息中可容纳 null 的字段被称为”可选项”。 当变量不一定被使用时,它们对减少状态大小很有用。6 O; Q8 o+ c0 M' g* X4 j
2 l4 ~  p7 f9 f0 e, n' K! @+ e
在变量或字段的类型声明后添加问号 (?),就可以将其设为可选变量或字段。 唯一的例外是 map<K, V>和 bounced<Msg>,你不能让它们、内部键/值类型(如果是 map)或内部消息(如果是 bounced)成为可选项。
$ z; G% o* Q4 O" U; F3 b
. v( [$ a# b0 S1 [% L6 Q未定义的可选变量或可选字段默认持有null值。 您必须先检查null,否则无法访问它们。 但如果你确定它们在某一时刻不是 null,可以使用非空断言操作符 !!访问它们的值。
; f  e1 @2 }$ e9 q
) U6 V7 Q' U! h1 o% u. m在未使用 !!或未事先检查 null 的情况下尝试访问可选变量或可选字段的值,如果编译器可以跟踪,则会导致编译错误;如果不能跟踪,则会导致退出码 128异常:空引用异常。9 ~8 }0 I5 w: A' r: \
  h: N6 d% E# x. x

5 s0 O5 S. a: D$ g7 @) K* p

- e* E+ w) v3 _
可选项举例:
  1. struct StOpt {/ _6 c- N; k  J/ C! w) ^* J( I
  2.     opt: Int?; // Int or null* g( X& N) u, c+ i
  3. }* J* y" v$ t3 W

  4. & f! t4 e8 i4 T# e
  5. message MsOpt {$ f; z4 `2 G0 G) a- r/ M3 F
  6.     opt: StOpt?; // Notice, how the struct StOpt is used in this definition
    5 W' `' J$ ?! G4 c! I5 m: f2 v) G# Z
  7. }
    # Z6 k1 f9 k; c% e

  8. + Z9 L7 `% M5 L5 Z1 p
  9. contract Optionals {3 w" V4 V/ J. Q3 l3 }  Y! j$ R
  10.     opt: Int?;
    - ^5 y' D/ M' Y' N
  11.     address: Address?;
    " m" @. @2 ^) C# [
  12. 8 U7 C& w0 n! W
  13.     init(opt: Int?) { // optionals as parameters
    0 ]4 ~2 F( ~5 j) l: K8 P/ M( u
  14.         self.opt = opt;, [# B' c) ~0 N
  15.         self.address = null; // explicit null value
    5 Z% n; q+ l2 W  L5 [
  16.     }9 S) k4 I; [$ j8 E7 E9 a

  17. , B) Q4 j2 f/ n$ Q4 [# s% T- N
  18.     receive(msg: MsOpt) {! ?% q+ s2 o% _2 J! `5 p
  19.         let opt: Int? = 12; // defining a new variable
    + }* X9 i" I& b% x! }: C
  20.         if (self.opt != null) { // explicit check* v+ u9 s+ `4 ?& l
  21.             self.opt = opt!!; // using !! as we know that opt value isn't null
    : H6 w# g  [5 K
  22.         }
    7 h2 [2 b6 t" g% [% g2 U
  23.     }; g3 W8 B; A! N8 R
  24. }
复制代码

; D! \/ @1 i, L+ K! ~( |
* \+ C$ A* Y9 h6 D" h- O
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则