case 표현식으로는 선택 목록에서 프로그램의 플로를 제어할 수 있습니다. Verse의 케이스 명령문을 통해 =를 사용하는 것처럼, 한 값을 여러 가능한 값과 비교하여 테스트하고 일치하는 값을 기반으로 코드를 실행할 수 있습니다.
케이스 표현식의 사용은 플레이 불가 캐릭터(NPC)가 있는 게임 등 모든 종류의 애플리케이션에서 볼 수 있습니다.
예를 들어 경비 생성 장치를 사용하여 순찰 옵션이 활성화된 경비를 생성한다고 가정하겠습니다. 경비는 게임에 생성된 뒤 대기(Idle), 순찰(Patrol), 경계(Alert), 공격(Attack), 채집(Harvest) 등 몇 가지 활성 스테이트를 가질 수 있습니다. 이 경비의 대략적인 스테이트 전환 다이어그램은 다음과 같습니다.
이러한 스테이트 전환을 게임 내에서 관찰할 수 있습니다.
이 비디오에서 경비에게는 순찰 옵션이 디폴트 행동으로 활성화되어 있습니다.
이 비디오에서 경비는 과학 기지 순찰에서 자원 채집으로 전환합니다. 이 경비는 플레이어를 발견하고, 떠오른 물음표로 표시되는 경계 스테이트로 전환한 다음 떠오른 느낌표로 표시되는 공격 스테이트에 돌입합니다.
경비는 스테이트에 따라 특정 행동을 보이며, 이러한 행동은 일반적으로 함수로 코딩되어 프로그램이 특정 스테이트로 들어가도록 선택할 때 호출됩니다.
경비의 스테이트 전환을 대략적인 코드로 살펴보면 다음과 같습니다.
case(GuardStateVariable):
idle_state =>
RunIdleAnimation()
SearchPlayerCharacter()
harvest_state =>
GatherResources()
alert_state=>
RunAlertAnimation()
PlayAlertSound()
DisplayAlertUIElement()
이 case 표현식은 경비가 특정 스테이트에 들어가면 어떤 함수를 실행할지 지시하는 라벨을 프로그램에 전달합니다.
이 표현식에서는 경비의 patrol_state가 디폴트 케이스입니다. 순찰이 활성화된 경비는 디폴트 순찰 행동을 실행해야 하기 때문입니다.
구문으로 보면 이는 다음과 같습니다.
expression0
case (test-arg-block):
label1 =>
expression1
label2 =>
expression2
_ =>
expression3 for the default case
expression4label1 및 label2 등 case 블록의 각 패턴은 constant => block 양식을 사용해야 하며, 여기서 상수는 인티저, 로직, 스트링, 문자, 열거형 상수가 될 수 있습니다. 따라서 case 명령문은 int, logic, string, char, 열거형으로만 작동합니다.
구조
구조적으로 Verse 케이스 표현식은 GuardStateVariable 테스트 실행인자 블록의 입력을 기반으로 코드를 실행하며, 기능적으로 일련의 if 표현식과 동일하게 작동합니다.
이 예시에서 Verse 프로그램은 GuardStateVariable이 alert_state로 리졸브되면 expression3을 실행합니다. 프로그램이 patrol_state를 전달하면 Verse는 구조적으로 디폴트 케이스로 점프하여 expression5를 실행합니다.
다른 컨트롤 플로와 케이스 사용하기
case 명령문이 loop 안에 있는 경우 case 명령문의 블록은 중단 및 재개될 수 있습니다. 또한 case 명령문의 블록은 들어 있는 함수로부터 반환될 수도 있습니다.
예를 들면 다음과 같습니다.
loop:
case (x):
42 => break
_ => {}이 이상한 루프는 x = 42인 경우 즉시 완료되고, 아니면 영원히 루프합니다.
다른 예시는 다음과 같습니다.
Foo(x : int) : int =
case (x):
100 => return 200
_ => return 100이 예시는 다음과 동일합니다.
Foo(x : int) : int =
case (x):
100 => 200
_ => 100이는 case 명령문이 함수의 마지막 표현식이기 때문입니다.
디폴트 케이스
_=> 케이스(디폴트 케이스)가 없는 case 명령문은 일치하는 케이스가 없는 경우 실패합니다. decides 이펙트가 있는 함수 등 실패 컨텍스트에서는 그런 case 명령문을 사용해도 괜찮습니다.
열거형의 모든 케이스와 일치하는 case 명령문은 _=> 케이스가 없더라도 실패하지 않습니다.