Nim 中的字符串枚举类型?

Ale*_*hin 4 nim-lang

是否可以为字符串定义类似枚举的类型?我知道枚举,但在这种情况下不想使用枚举,我想使用它,就好像它只是一个字符串一样。

type Blog = object
  text:     string
  priority: "low" | "normal" | "high"

echo Blog(text: "something...", priority: "high")
Run Code Online (Sandbox Code Playgroud)

pie*_*ter 5

枚举可以附加一个字符串值。转换器可用于将字符串自动解析为枚举。示例(游乐场):

import strutils  # for parseEnum

type
  Priority = enum
    pLow = "low", pNormal = "normal", pHigh = "high"
  Blog = object
    text:     string
    priority: Priority

converter toPriority(s: string): Priority = parseEnum[Priority](s)

echo Blog(text: "something...", priority: "high")
#note that parseEnum is style insensitive
echo Blog(text: "something...", priority: "LOW")
try:
  echo Blog(text: "something...", priority: "medium")
except:
  echo getCurrentExceptionMsg()
Run Code Online (Sandbox Code Playgroud)

输出:

(text: "something...", priority: high)
(text: "something...", priority: low)
invalid enum value: medium
Run Code Online (Sandbox Code Playgroud)

类型定义和转换器可能会在宏中自动化,例如:

stringEnum:
  Priority = ["low", "medium", high"]
Run Code Online (Sandbox Code Playgroud)

宏的实现留给读者作为练习:)