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

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

回答

收藏

Tact 语言基础| 可选项

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

本帖最后由 riyad 于 2025-4-1 20:01 编辑 : Q; x6 q2 s1 S5 C/ S

7 b- C9 Y6 y2 R+ p, K" C6 Q% }% I& ?类型系统概述中提到,所有原始类型、结构体和消息都可以为空。 也就是说,它们不一定有任何值,除了 null —— 一个特殊的值,表示故意缺少任何其他值。
4 t% p% a+ ?. g4 j% A% O  k. g; P) K9 }! P! Q
变量或结构和消息中可容纳 null 的字段被称为”可选项”。 当变量不一定被使用时,它们对减少状态大小很有用。
1 \* E& i) }; r& L
1 b$ N4 E! t( h, w在变量或字段的类型声明后添加问号 (?),就可以将其设为可选变量或字段。 唯一的例外是 map<K, V>和 bounced<Msg>,你不能让它们、内部键/值类型(如果是 map)或内部消息(如果是 bounced)成为可选项。% r* @' E2 W- y0 J1 }* @! c

( P3 e' F) d/ B7 B) }) t未定义的可选变量或可选字段默认持有null值。 您必须先检查null,否则无法访问它们。 但如果你确定它们在某一时刻不是 null,可以使用非空断言操作符 !!访问它们的值。( P3 K4 X8 ?' @0 ]& D# S  d% l- Y
7 O/ U+ L. v" x, \' l
在未使用 !!或未事先检查 null 的情况下尝试访问可选变量或可选字段的值,如果编译器可以跟踪,则会导致编译错误;如果不能跟踪,则会导致退出码 128异常:空引用异常。
& W; o0 \4 g7 _; R. M# E: L- q( K2 d$ q5 W# y* L, e
/ E& b4 y9 b" I. k' d

* Y( F9 y# D7 z" w) Q. ^! a
可选项举例:
  1. struct StOpt {
    1 L7 ^. B1 ~; c
  2.     opt: Int?; // Int or null: j  A1 u- I) c
  3. }' R8 N* c6 `, r3 X$ H

  4. / e" M+ y% R( b+ S/ L& x0 N9 Y
  5. message MsOpt {8 z4 j3 t4 Z5 l" M
  6.     opt: StOpt?; // Notice, how the struct StOpt is used in this definition
    0 z8 q. U; Z3 @) F  d" s  n# @
  7. }
    " f/ A2 K. B) Z; E( X) J
  8. / o( u  v$ k1 M) Y
  9. contract Optionals {" m) n7 o% d+ d; n' k1 \* r  {
  10.     opt: Int?;! f. o) a+ w0 K# f  Q( N
  11.     address: Address?;
    , Q1 {0 Q6 U. J2 G
  12. , j" |) Y$ ?; p6 I) C
  13.     init(opt: Int?) { // optionals as parameters
    . {  W" T( W& M5 l' ?8 u
  14.         self.opt = opt;
    1 e6 n: I6 [: G! g: j
  15.         self.address = null; // explicit null value3 h- M( @2 X; e/ T" W8 e
  16.     }: }5 [$ B' y$ p3 |3 i5 t2 t
  17. ' F1 j9 Z- d& T: p9 X
  18.     receive(msg: MsOpt) {& O7 u8 R) \, ^( G
  19.         let opt: Int? = 12; // defining a new variable) i& A4 I% j  w$ X3 S, r
  20.         if (self.opt != null) { // explicit check
    2 m+ e4 M& g$ e" {
  21.             self.opt = opt!!; // using !! as we know that opt value isn't null2 S+ x  ^8 v0 c8 ^
  22.         }9 ~2 R1 X( e& G" i
  23.     }9 f" N0 h$ l, w( @# h2 w' A$ P7 ~5 }1 t
  24. }
复制代码

7 c2 y0 r( h5 S$ G# z" F0 E' z5 s) M, G* q9 I
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则