文档 / 语言手册 / If-Else & 循环
Edit

If-Else & 循环

ReScript 支持 ifelse,三目运算符(a ? b : c),for 循环和 while 循环。

ReScript 还支持十分强大的模式匹配,我们将用一个专门的章节介绍它。

If-Else & 三目运算符

与它的 JavaScript 对应不同,ReScript的 if 是一个表达式;它们对表达式体中的内容进行求值:

ReScriptJS Output
let message = if isMorning {
  "Good morning!"
} else {
  "Hello!"
}

注意:没有 else 分支的 if-else 表达式隐式给出了 ()unit 类型)作为 else 分支的值。所以:

ReScriptJS Output
if showMenu {
  displayMenu()
}

和以下代码基本相同:

ReScriptJS Output
if showMenu {
  displayMenu()
} else {
  ()
}

从另一个角度看这个特性,这显然是错误的:

RES
let result = if showMenu { 1 + 2 }

它会抛出一个类型错误,隐含的 else 分支的类型是 unit,而 if 分支的类型是 int。直观地说,这样做是有道理的:如果 showMenufalse,那 result 的值又应该是什么呢?

我们还提供了三目运算符,作为语法糖,但是我们鼓励你优先使用 if-else 表达式

ReScriptJS Output
let message = isMorning ? "Good morning!" : "Hello!"

if-else 和三目运算符在 ReScript 中的使用比其他语言少得多模式匹配消灭了一整类以前需要条件表达式的代码。

for 循环

for 循环从一个起始值迭代到终止值(包括终止值)。

ReScriptJS Output
for i in startValueInclusive to endValueInclusive {
  Js.log(i)
}
ReScriptJS Output
// prints: 1 2 3, one per line
for x in 1 to 3 {
  Js.log(x)
}

你可以通过使用 downtofor 从大到小计数。

ReScriptJS Output
for i in startValueInclusive downto endValueInclusive {
  Js.log(i)
}
ReScriptJS Output
// prints: 3 2 1, one per line
for x in 3 downto 1 {
  Js.log(x)
}

while 循环

while 循环在其条件为 true 时执行 body 代码块。

ReScriptJS Output
while testCondition {
  // body here
}

技巧和诀窍

在 ReScript 中没有跳出循环的 break 关键字(也没有从函数中提前返回的 return)。然而,我们可以通过使用一个可变绑定来轻松地脱离一个 while 循环。

ReScriptJS Output
let break = ref(false)

while !break.contents {
  if Js.Math.random() > 0.3 {
    break := true
  } else {
    Js.log("Still running")
  }
}