包
Flux 源代码被组织成包。一个包由一个或多个源文件组成。每个源文件被单独解析并组合成一个单独的包。
File = [ PackageClause ] [ ImportList ] StatementList .
ImportList = { ImportDeclaration } .
包子句
PackageClause = [ Attributes ] "package" identifier .
包子句定义当前包的名称。包名称必须是有效的 Flux 标识符。包子句必须位于任何 Flux 源文件的开头。同一包中的所有文件必须声明相同的包名称。当文件未声明包子句时,该文件中的所有标识符将属于特殊的 main
包。
主包
main
包因以下几个原因而特殊
- 它定义了 Flux 程序的入口点。
- 它不能被导入。
- 所有语句都被标记为产生副作用。
导入声明
ImportDeclaration = [ Attributes ] "import" [identifier] string_lit
每个包都关联一个包名称和一个导入路径。导入语句获取包的导入路径,并将该包中定义的所有标识符引入到当前作用域下的命名空间中。导入语句定义了访问导入标识符的命名空间。默认情况下,此命名空间的标识符是包名称,除非另有指定。例如,给定在包 foo
中声明的变量 x
,导入 foo
并引用 x
将如下所示
import "import/path/to/package/foo"
foo.x
或者这样
import bar "import/path/to/package/foo"
bar.x
包的导入路径始终是绝对的。一个包可以为其导入的包之一中声明的选项标识符重新赋值。一个包不能访问或修改属于其导入包的导入包的标识符。导入包中包含的每个语句都会被评估。
包初始化
包按以下顺序初始化
- 所有导入的包都被初始化并分配给它们的包标识符。
- 所有选项声明都会被评估和赋值,而与顺序无关。一个选项不能依赖于同一包块中分配的另一个选项。
- 所有变量声明都会被评估和赋值,而与顺序无关。一个变量不能直接或间接地依赖于自身。
- 任何包副作用都会被评估。
一个包在所有文件块和所有包块中只会被初始化一次,无论它被导入多少次。
初始化导入的包必须是确定性的。具体而言,在所有导入的包都被初始化之后,每个选项都必须被分配相同的值。在同一文件块中导入的包按声明顺序初始化。在不同文件块中导入的包没有已知的顺序。当一组导入修改同一个选项时,必须通过将它们放在同一个文件块中来对其进行排序。
此页是否对您有帮助?
感谢您的反馈!