ReScript in Korean

제어 흐름

원문

리스크립트에서는 if, else, 삼항 표현(ternary expression), forwhile을 지원합니다.

리스크립트는 그 유명한 패턴 매칭 역시 지원합니다. 이와 관련한 자세한 내용은 여기에서 확인할 수 있습니다.

If-Else & 삼항 표현(Ternary)

자바스크립트에서와 달리, 리스크립트의 if는 표현(expression)입니다. 즉, 바디(body)의 내용을 평가합니다.

let message = if isMorning {
"Good morning!"
} else {
"Hello!"
}
var message = isMorning ? 'Good morning!' : 'Hello!';

참고: if-else 표현에서 else 브랜치가 없는 경우, 암시적으로 ()를 제공합니다. (unit 타입이라고 부릅니다). 다음을 확인하세요.

if showMenu {
displayMenu()
}
if (showMenu) {
displayMenu();
}

이는 다음과 기본적으로 같습니다.

if showMenu {
displayMenu()
} else {
()
}
if (showMenu) {
displayMenu();
}

아래에서 다른 방법으로 이를 확인할 수 있습니다. 물론 이건 명백히 잘못된 표현입니다.

let result = if showMenu {
1 + 2
}

위 코드에서, else 브랜치는 암시적으로 unit 타입을 반환하고 if 브랜치는 int 타입을 반환하기 때문에 두 타입이 다르다는 오류가 발생합니다. 직관적으로 봐도 이것은 상식적입니다: 만약 showMenufalse라면 result의 값은 뭐가 돼야 할까요?

리스크립트는 삼항 축약 표현(ternary sugar)도 제공합니다. 그러나 가능하면, if-else를 사용 할 것을 장려합니다

let message = isMorning ? "Good morning!" : "Hello!"
var message = isMorning ? 'Good morning!' : 'Hello!';

리스크립트에서는 다른 언어에서보다 if-else와 삼항 표현(ternary)을 극히 드물게 사용합니다; 강력한 패턴매칭이 이전에 필수로 사용해야 했던 코드들을 지워 버렸습니다.

For 루프(loop)

For 루프(loop)는 시작 값부터 끝 값까지(끝 값도 포함) 반복합니다.

for i in startValueInclusive to endValueInclusive {
Js.log(i)
}
for (var i = startValueInclusive; i <= endValueInclusive; ++i) {
console.log(i);
}
/* prints: 1 2 3 */
for x in 1 to 3 {
Js.log(x)
Js.log(" ")
}
for (var x = 1; x <= 3; ++x) {
console.log(x);
console.log(' ');
}

for 루프 카운트에 downto를 이용하면 반대 방향으로 반복할 수 있습니다.

for i in startValueInclusive downto endValueInclusive {
Js.log(i)
}
for (var i = startValueInclusive; i >= endValueInclusive; --i) {
console.log(i);
}
/* prints: 3 2 1 */
for x in 3 downto 1 {
Js.log(x)
Js.log(" ")
}
for (var x = 3; x >= 1; --x) {
console.log(x);
console.log(' ');
}

While 루프(loop)

While 루프는 조건이 참(true)일 때까지 그 바디(body)의 코드 블록을 실행합니다.

while testCondition {
/* body here */
}
while (testCondition) {
/* body here */
}

팁과 트릭

리스크립트는 루프를 탈출하는 break 키워드가 없습니다. (함수에서 빠른 탈출을 위한 return 키워드도 없습니다.) 그러나 뮤터블 바인딩을 이용해 while 루프를 쉽게 탈출할 수 있습니다.

let break = ref(false)
while !break.contents {
if Js.Math.random() > 0.3 {
break := true
} else {
Js.log("Still running")
}
}
var $$break = {
contents: false,
};
while (!$$break.contents) {
if (Math.random() > 0.3) {
$$break.contents = true;
} else {
console.log('Still running');
}
}