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 这个例子中,我们通过分解这个模板来演示。

真正有前缀的字符串确实能拿到正确的结果,但是我们也可以看到,当 ab 一样的时候, 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
我们绝不会将你的邮箱分享给任何人。
2022 Hofstadter, Inc