Switch 声明
模板
我们可以使用 list 推导来模拟 switch 声明,
x: _
result: [
// case
if x == "x" {...},
// case
// case
// default
...,
][0] // here we select the first element
这个模板在 list 中有很多 if
条件或 守卫,然后选择第 [0]
个元素。
通过这种方式,我们模拟了 switch 声明,就像其他语言一样。
需要注意的是,所有的条件声明都会被求值。
一个简单的例子
这个例子演示如何将 integer 转为描述其数字类型的 string。
switch.cue
x: 0
result: [
if x < 0 {"negative"},
if x > 0 {"positive"},
"zero",
][0]
cue export switch.cue
{
"x": 0,
"result": "zero"
}
顺序相关性
在下面 order
这个例子中,我们通过分解这个模板来演示。
真正有前缀的字符串确实能拿到正确的结果,但是我们也可以看到,当 a
和 b
一样的时候,
HasPrefix 仍然可以匹配,所以我们会得到不那么准确的结果。
order.cue
import "strings"
#compare: {
a: string
b: string
l: [
if strings.HasPrefix(b, a) {"prefix"},
if a == b {"same"},
"none",
]
result: l[0]
}
ex1: (#compare & {a: "a", b: "abc"})
ex2: (#compare & {a: "abc", b: "abc"})
cue export order.cue
{
"ex1": {
"a": "a",
"b": "abc",
"l": [
"prefix",
"none"
],
"result": "prefix"
},
"ex2": {
"a": "abc",
"b": "abc",
"l": [
"prefix",
"same",
"none"
],
"result": "prefix"
}
}
case 未覆盖错误
我们可以修改一下我们第一个例子来演示如果忘记 default 默认值的话会发生什么,或未覆盖所有条件的话会发生什么。
uncovered.cue
x: 0
result: [
if x < 0 {"negative"},
if x > 0 {"positive"},
][0]
cue export uncovered.cue
result: index out of range [0] with length 0:
./uncovered.cue:6:3
所有的条件都会求值
你可能会觉得下面的例子能正常运行而不会报错。
这是所有条件被求值之后的结果,也就是说,求值过程没有死循环。
conditions.cue
l: []
result: [
if len(l) == 0 {"empty"},
if l[0] {"starts with true"},
][0]
cue export conditions.cue
index out of range [0] with length 0:
./conditions.cue:5:7