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

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

回答

收藏

Tact 语言基础| 可选项

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

本帖最后由 riyad 于 2025-4-1 20:01 编辑 ( _0 N: R2 V1 m7 }
) t" Q1 O& _6 H! H5 ~5 ]5 @& l- P
类型系统概述中提到,所有原始类型、结构体和消息都可以为空。 也就是说,它们不一定有任何值,除了 null —— 一个特殊的值,表示故意缺少任何其他值。( l) [, y; t( }( F0 w4 A

7 u* r8 S4 I$ J  c- A' O变量或结构和消息中可容纳 null 的字段被称为”可选项”。 当变量不一定被使用时,它们对减少状态大小很有用。' X, _' K! r) \8 E& c0 _/ |! z
( a9 ?4 p3 v) K& c" Q" ]
在变量或字段的类型声明后添加问号 (?),就可以将其设为可选变量或字段。 唯一的例外是 map<K, V>和 bounced<Msg>,你不能让它们、内部键/值类型(如果是 map)或内部消息(如果是 bounced)成为可选项。
8 R. t; u2 m1 [4 l# B7 E6 B7 q9 L2 b1 T; E! @
未定义的可选变量或可选字段默认持有null值。 您必须先检查null,否则无法访问它们。 但如果你确定它们在某一时刻不是 null,可以使用非空断言操作符 !!访问它们的值。( ^, Z4 p+ `& {6 W7 ~$ k, y
. y. O; w, O. \9 }) B0 c* `8 o
在未使用 !!或未事先检查 null 的情况下尝试访问可选变量或可选字段的值,如果编译器可以跟踪,则会导致编译错误;如果不能跟踪,则会导致退出码 128异常:空引用异常。( S# F3 O3 N) v( c: x: K" F
: L: t. _  w. h! @: @& v

9 C# }0 i9 W! d' l. v: A, R7 |
3 O$ {7 E! @# a' l9 T2 r% J
可选项举例:
  1. struct StOpt {+ `' u3 r9 F$ u: p. z9 M$ J
  2.     opt: Int?; // Int or null
    ( [* g1 T8 p; ^* Y8 c% K  h  J8 P* _
  3. }
    ( _/ I! x' N5 L
  4. 2 A( K( d/ X5 i, U; J- Y! P+ t0 k* |
  5. message MsOpt {
    5 s. o+ s( B& d2 I: z% R) g4 p
  6.     opt: StOpt?; // Notice, how the struct StOpt is used in this definition6 |" U6 w% {  D
  7. }% p3 _# S( _3 ^+ `
  8. 1 o7 c5 B, |( y" Z! G
  9. contract Optionals {7 C' `& Z( v- e8 j% t
  10.     opt: Int?;! _/ ~, G, u$ }" h
  11.     address: Address?;
    1 S$ E4 H, }1 R) J) s
  12. ) p: {( o4 O2 D
  13.     init(opt: Int?) { // optionals as parameters
    & a5 V# d) U& n3 D. F+ U
  14.         self.opt = opt;  k8 @1 |4 Y2 |3 b  H6 y( N
  15.         self.address = null; // explicit null value
    1 p6 ^+ u6 l( \0 C$ a
  16.     }
    . u2 s8 `( }9 j# F9 R. |
  17. . Y4 Z; v4 C3 `% z7 p1 T
  18.     receive(msg: MsOpt) {
    # S0 C/ |1 e+ e# ?, W
  19.         let opt: Int? = 12; // defining a new variable
    + K2 e; M6 F' a2 N4 c* n3 A7 z: f
  20.         if (self.opt != null) { // explicit check) H- n1 q" z9 f: G
  21.             self.opt = opt!!; // using !! as we know that opt value isn't null
    # ]2 ~' o/ K+ Q+ w$ r" L/ }  Z+ |
  22.         }$ t: b, S7 f9 Y
  23.     }- J. b# v/ n2 g
  24. }
复制代码

! d( E% r( n/ m, _, n, M3 ^
$ ]& E" D8 k8 u( R7 ~  a* k
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则