赋值和范围
赋值将标识符绑定到变量、选项或函数。
程序中的每个标识符必须被赋值。
Flux使用块进行词法范围界定:
- 预先分配的标识符的作用域在宇宙块中。
- 在顶层(任何函数外部)表示变量、选项或函数的标识符的作用域是包块。
- 导入包的名称作用域是包含导入声明的文件块。
- 表示函数参数的标识符的作用域是函数体。
- 在函数内部赋值的标识符的作用域是最内层的包含块。
在一个块中分配的标识符可以在内部块中重新分配,选项标识符除外。当内部赋值的标识符在作用域内时,它表示由内部赋值分配的实体。
请注意,包声明不是赋值。 包名称不出现在任何作用域中。 它的目的是识别属于同一包的文件,并为导入声明指定默认的包名称。
变量赋值
变量赋值创建一个绑定到标识符的变量,并给它一个类型和值。 一个变量在其生命周期内保持相同的类型和值。 在一个块中赋值给变量的标识符在同一块中不能被重新赋值。 标识符可以在内部块中被重新赋值或隐藏。
VariableAssignment = identifier "=" Expression .
变量赋值示例
在这个代码片段中,n 和 m 在外部块中被定义为整数。在匿名函数内部,n 和 m 被定义为字符串,但仅在该作用域内。因此,虽然函数将返回 "ab",但外部作用域中的 n 和 m 保持不变,仍然是 n = 1 和 m = 2。
n = 1
m = 2
x = 5.4
f = () => {
n = "a"
m = "b"
return n + m
}
选项分配
OptionAssignment = "option" [ identifier "." ] identifier "=" Expression .
选项赋值创建一个与标识符绑定的选项,并赋予它一个类型和一个值。 选项只能在包块中赋值。 一旦声明,选项在同一个包块中不得重新声明。 在一个包中声明的选项可以在另一个包中重新赋值。 选项在其生命周期的剩余时间内保持相同的类型。
示例
// alert package
option severity = ["low", "moderate", "high"]
// foo package
import "alert"
option alert.severity = ["low", "critical"] // qualified option
option n = 1
option n = 2
f = (a, b) => a + b + n
x = f(a:1, b:1) // x = 4