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

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

回答

收藏

Tact 语言基础| 可选项

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

本帖最后由 riyad 于 2025-4-1 20:01 编辑
/ p! Y6 {2 T% h& ^$ m* o& y
( N5 P$ o4 G  V0 Q! F3 [' y类型系统概述中提到,所有原始类型、结构体和消息都可以为空。 也就是说,它们不一定有任何值,除了 null —— 一个特殊的值,表示故意缺少任何其他值。
0 p2 X9 t* Q) J) d7 h4 P. w/ p% k5 n' d9 f. h
变量或结构和消息中可容纳 null 的字段被称为”可选项”。 当变量不一定被使用时,它们对减少状态大小很有用。0 J" ~3 S5 B/ \; q3 H  [
: M. S8 n0 g% _# M/ c; y
在变量或字段的类型声明后添加问号 (?),就可以将其设为可选变量或字段。 唯一的例外是 map<K, V>和 bounced<Msg>,你不能让它们、内部键/值类型(如果是 map)或内部消息(如果是 bounced)成为可选项。
; i/ G1 {$ @( D
: Z: {9 G) ^, {$ l  W  B未定义的可选变量或可选字段默认持有null值。 您必须先检查null,否则无法访问它们。 但如果你确定它们在某一时刻不是 null,可以使用非空断言操作符 !!访问它们的值。
( E* n# e1 M. L7 }) ^' o1 P" j  ?- }
在未使用 !!或未事先检查 null 的情况下尝试访问可选变量或可选字段的值,如果编译器可以跟踪,则会导致编译错误;如果不能跟踪,则会导致退出码 128异常:空引用异常。* Q6 W/ r& Y6 `: P3 [, M. s
& \* d# [* Z% m

5 d- u, j. S4 z# I# i  Q

+ R3 ?% o; ~! w% [- _
可选项举例:
  1. struct StOpt {
    ; n% S% Y3 m) C. `
  2.     opt: Int?; // Int or null$ Y& g1 H- g* m8 z9 o/ t# W* P
  3. }( u# Y- Y. ]% B# y3 A5 t

  4. & I5 H+ ]9 d. o2 c9 ^2 k, G
  5. message MsOpt {% l% B$ K( I: H* t2 k
  6.     opt: StOpt?; // Notice, how the struct StOpt is used in this definition
    2 X2 |" v0 ?* @: ]" i9 l
  7. }7 S9 w. p7 H+ c& Y& d( }+ n' S
  8. 0 D6 X# A% \. @+ P0 L
  9. contract Optionals {
    ; q. ]( j* A) s% t
  10.     opt: Int?;
    9 l/ t4 V- n& l6 B* v2 N; t0 Z' p, C
  11.     address: Address?;
    4 _  O# J, f7 m% o5 H

  12. , ?+ N. Y8 {% _9 K8 ^8 H
  13.     init(opt: Int?) { // optionals as parameters
    . Y2 H* s! L% I. p8 g% h
  14.         self.opt = opt;
    3 |# ?" S, d) O, t2 }2 f
  15.         self.address = null; // explicit null value. K2 C/ k6 @8 e
  16.     }+ A3 k2 f5 ?+ ]$ X, r

  17. . C* w% O: t9 `9 g- G5 U7 k
  18.     receive(msg: MsOpt) {0 x2 i  G" c( R+ L2 c1 @
  19.         let opt: Int? = 12; // defining a new variable
    4 g5 Z6 Y) \, m0 O
  20.         if (self.opt != null) { // explicit check! ?8 W( f  t  O  w
  21.             self.opt = opt!!; // using !! as we know that opt value isn't null- i- D9 g7 n; D8 l* _6 S0 J; Q
  22.         }9 I1 s% m  |- m7 C6 P% N' m
  23.     }+ y) E  c: s. ^0 a0 c# }# k3 x) R' V: b
  24. }
复制代码

7 x9 a8 J# N- t3 T4 M/ |
3 f3 [3 W. e/ V0 S
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则