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

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

回答

收藏

Tact 语言基础 | Maps

开源社区 开源社区 8311 人阅读 | 0 人回复 | 2025-03-26

Maps复合类型 map<K, V> 用于将 K 类型的键与 V 类型的相应值关联起来例如,map<Int, Int> 使用 Int 类型作为其键和值:9 d. `, X) v3 ]1 A. ~' r8 p& k
  1. struct IntToInt {1 U( K' b# R3 |8 P* \# f6 d
  2.     counters: map<Int, Int>;
    ( Y/ [" v  q# x. Z' C* Z4 Q- l+ Q
  3. }
复制代码

( p! v4 n( \. v' l7 E) J
) \: R0 ]1 K6 R# ]) O( _" ^8 }+ w7 y" M8 _9 w3 i
操作
$ j, J' L6 x6 o- m6 w, J8 [* H  NDeclare, emptyMap()
5 z$ F& \+ f0 O) u0 S% ]4 C作为局部变量,使用标准库的 emptyMap() 函数:
# ^! ?; o$ j* l+ N+ O0 c8 j+ V% j# ?
  1. let fizz: map<Int, Int> = emptyMap();. n. h0 y9 u; i( W& q5 y
  2. let fizz: map<Int, Int> = null; // identical to the previous line, but less descriptive
复制代码
作为 持久状态变量:5 j! S3 m1 y* `2 X# f1 B, O
  1. contract Example {
    ) l, b8 x8 }; a9 E" u  v2 H' e5 w
  2.     fizz: map<Int, Int>; // Int keys to Int values
    & C9 X8 w2 v, ^2 c9 a; n
  3.     init() {3 o* v+ r# K) ?  R
  4.         self.fizz = emptyMap(); // redundant and can be removed!
    . H1 K) {" ^" e2 B; V
  5.     }3 D& B/ s9 @+ h5 A
  6. }
复制代码
请注意,类型为 map<K, V> 的 持久状态变量 默认为空,不需要默认值,也不需要在 init() 函数中进行初始化。2 P. ~* c; h; H# _# L$ u

/ b0 t4 @, e6 `+ F
, w+ U; [% }# R4 D; ~! K  |7 G) |: Z8 C, R* G. o
设置值,.set()( N; p/ o5 b) \* k
要设置或替换键下的值,请调用 .set() 方法,所有 map 都可以使用该方法。
1 e/ c& x+ i- b8 c+ @- U* N
  1. // Empty map2 o% K' \+ D  u% r
  2. let fizz: map<Int, Int> = emptyMap();1 Z6 Y9 h$ o& d: C" ?+ S: `8 S* F- g; u

  3. ' j( R1 ?% T0 M
  4. // Setting a couple of values under different keys
    ) {6 ^- z. F* `6 G# `  y
  5. fizz.set(7, 7);
    7 P: d, H4 Q. A0 w8 g
  6. fizz.set(42, 42);# R5 i6 Q5 j4 Z* m9 o% J% Y6 i
  7. & c) h$ x+ b4 w- R' h. X
  8. // Overriding one of the existing key-value pairs
    4 ?6 p1 o7 [7 x( @& O$ |
  9. fizz.set(7, 68); // key 7 now points to value 68
复制代码
  1. // Empty map( @0 ^5 E' G, A2 v: R$ M
  2. let fizz: map<Int, Int> = emptyMap();" W4 z; E% b; t
  3. , C; m! M* O3 g4 v
  4. // Setting a value7 T2 G" E; T5 |! `4 E7 ]
  5. fizz.set(68, 0);
    ! ]7 v( h% [. k
  6. ) q) R2 j0 ], O6 y+ f( K. }+ I  w# ?
  7. // Getting the value by its key  H3 I. U; d/ ~+ s
  8. let gotButUnsure: Int? = fizz.get(68);          // returns Int or null, therefore the type is Int?
    ; J$ O& u: N' U! W& h
  9. let mustHaveGotOrErrored: Int = fizz.get(68)!!; // explicitly asserting that the value must not be null,2 Z( E6 w3 C$ E# _8 W, @
  10.                                                 // which may crush at runtime if the value is, in fact, null/ b  }+ r1 N# p. w8 w% k; q- U
  11. 7 W0 K, \9 A. P$ t/ u5 A; X
  12. // Alternatively, we can check for the key in the if statement
    ) r  R3 Y. x& `4 f
  13. if (gotButUnsure != null) {
    8 L: u$ i8 h5 s, R
  14.     // Hooray, let's use !! without fear now and cast Int? to Int  m+ `1 A0 p% E& ~3 V7 f  K7 a3 Y! d8 P
  15.     let definitelyGotIt: Int = fizz.get(68)!!;+ u0 S( e* S6 i# {
  16. } else {7 ?: c& A8 t8 p8 S( t) X2 U# ~
  17.     // Do something else...
    ! X( O+ _, v1 z' M5 x
  18. }
复制代码
# i2 k1 k9 `. _# m! C4 d

  P8 z$ m$ [! X9 h0 b' M9 o* b9 L! G: c

# `: h2 t, S- G, I: Q( z8 q0 Y( s  v" i2 D' r; m/ Z
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则