以下语句可出现在 function 主体的任何位置。
let
语句
let
语句允许声明局部变量和 block-scoped 变量。
在 Tact 中,声明一个局部变量总是需要一个初始值。但是,也可以省略类型标注,Tact 会尝试从初始值推断类型:
请注意,null
的初始值既可以指具有任意 K
和 V
类型的空map<K, V>
,也可以指故意不为optional类型设置任何其他值。 这就是为什么在声明 optional 或 map<K, V>
时,需要明确指定类型,因为无法推断:
用下划线 _
命名局部变量时,其值将被视为未使用并丢弃。 当你不需要某个函数的返回值(有副作用),并想明确地将变量标记为未使用时,这种方法就很有用。 注意,不能访问通配符变量名 _
:
return
语句
return
语句结束 function 的执行,并指定要返回给 function 调用者的值。
block
块语句用于组合零个或多个语句。 块由一对大括号(“大括号”、{}
)分隔,包含一个由零个或多个语句和声明组成的列表。
某些语句,如 let
或 return
,必须以结束分号 ;
结束。 不过,语块中最后一条语句的分号是可选的,可以省略。
表达
表达式语句是一种表达式,用于预期需要语句的地方。 表达式被求值后,其结果将被丢弃—因此,它只适用于有副作用的表达式,如执行函数或更新变量。
任务
赋值语句使用 赋值运算符 (=
)或 增强赋值运算符 (赋值与运算相结合):
分支机构
控制代码流
if...else
在执行 if...else
语句时,首先会对指定条件进行评估。 如果结果值为 true
,则执行下面的语句块。 否则,如果条件评估结果为 false
,将执行可选的 else
块。 如果缺少 else
块,则什么也不会发生,执行仍将继续。
常规 if
语句:
else
块:
使用嵌套的 if...else
:
try...catch
try...catch
语句由一个 try
块和一个可选的 catch
块组成,它接收一个 [Int
][int]退出代码作为唯一参数。 首先执行 try
块中的代码,如果失败,则执行catch
块中的代码,并尽可能回滚try
块中的更改。
常规 try
语句:
用 catch (e)
块:
使用嵌套的 try...catch
:
请注意,与 let
语句类似,在 catch ()
子句中捕获的退出代码可以通过指定下划线 _
来丢弃:
循环
有条件地多次重复某些代码块。
repeat
repeat复
循环执行指定次数的代码块。重复次数应该是一个正的 32 位 [Int
][int],范围从 1 到 231−1。如果数值大于这个范围,将出现 exit code 5,“Integer out of the expected range ”的错误。
如果指定的重复次数等于 0 或包含范围 −2256 至 −1 中的任何负数,则忽略该值,不执行代码块。
while
只要给定条件为 true
,while
循环就会继续执行代码块。
在下面的示例中,每次迭代时,x
的值都会递减 1,因此循环将运行 10 次:
do...until
do...until
循环是一个后测试循环,它至少执行一次代码块,然后继续执行,直到给定条件变为 true
。
在下面的示例中,每次迭代时,x
的值都会递减 1,因此循环将运行 10 次:
foreach
foreach
循环按顺序对 map<K, V>
类型的键值对(条目)进行操作:从 map 的最小键到最大键。
该循环为给定映射中的每个条目执行一个代码块,每次迭代都会捕获键和值。 当您事先不知道地图中有多少个条目,或不想明确地使用地图的 .get()
method 查找每个条目时,这将非常方便。
请注意,每次迭代时捕获的键和值对的名称是任意的,可以是任何有效的 Tact 标识符,只要它们是当前作用域的新标识符即可。 最常见的选项是k “和 “v”,或 “key “和 “value”。
在下面的示例中,地图 cells
有 4 个条目,因此循环将运行 4 次:
还可以遍历合约存储中的映射,以及作为 Struct 或 Message 类型实例成员的映射:
请注意,与 let
语句类似,可以通过指定下划线 _
来丢弃捕获的键或值(或两者):