6.1 模块的导入 (import)

  • 核心概念: 模块是一种将相关代码组织在一起的机制,可以提高代码的可重用性和可维护性。

  • import 语句: 用于导入其他模块中的函数、变量和数据类型。

  • 语法:

    import 模块名;
    
  • 模块名: 指要导入的模块的标识符,通常对应于一个 .fs 文件。

  • 模块查找: FlexScript 解释器会按照一定的搜索路径查找模块文件。

  • 模块作用域: 导入模块后,可以使用 模块名.成员名 的方式访问模块中的成员。

  • 示例代码:

    // 模块文件:math_utils.fs
    int add(int a, int b) {
        return a + b;
    }
    
    // 主程序文件:main.fs
    import math_utils;
    
    int result = math_utils.add(10, 20);
    print(result); // 输出 30
    
  • 模块别名: 可以使用 as 关键字为导入的模块指定别名。

    import math_utils as math;
    
    int result = math.add(10, 20);
    
  • 部分导入: 可以使用 from 关键字从模块中导入特定的成员。

    from math_utils import add;
    
    int result = add(10, 20);
    
  • 模块初始化: 模块文件中的顶层代码会在模块导入时执行一次,用于初始化模块。

6.2 脚本的包含 (include)

  • 核心概念: include 语句用于将一个脚本文件中的代码插入到当前脚本中。

  • 语法:

    include "文件名.fs";
    
  • 文件名: 指要包含的脚本文件的路径,可以是相对路径或绝对路径。

  • 包含作用: 被包含的脚本文件中的代码会直接插入到 include 语句所在的位置。

  • 包含时机: include 语句在编译时执行,而不是在运行时执行。

  • 示例代码:

    // 文件:common_functions.fs
    void printLine() {
        print("--------------------");
    }
    
    // 主程序文件:main.fs
    printLine(); // 错误,printLine 未定义
    
    include "common_functions.fs";
    
    printLine(); // 输出 --------------------
    
  • 包含路径: 包含文件时,解释器会按照一定的搜索路径查找文件。

  • 嵌套包含: 脚本文件可以包含其他脚本文件,形成嵌套包含。

  • 避免循环包含: 应该避免循环包含,否则会导致编译错误。

6.3 模块搜索路径

  • 核心概念: FlexScript 解释器在导入模块或包含脚本时,会按照一定的搜索路径查找文件。

  • 搜索路径配置: 搜索路径可以通过环境变量或配置文件进行配置。

  • 默认搜索路径: 默认搜索路径通常包括当前目录和标准库目录。

  • 添加搜索路径: 可以通过设置环境变量或配置文件来添加额外的搜索路径。

  • 搜索顺序: 解释器会按照搜索路径的顺序查找文件,找到第一个匹配的文件后停止搜索。

  • 示例代码(假设搜索路径包含 “/path/to/modules”):

    // 假设 /path/to/modules/my_module.fs 存在
    import my_module; // 解释器会在 /path/to/modules 中查找 my_module.fs
    
  • 模块文件组织: 建议将模块文件放在一个专门的目录中,并将其添加到搜索路径中。

  • 避免文件名冲突: 应该避免不同模块使用相同的文件名,以免发生冲突。

6.4 模块和脚本的区别

  • 作用域: 模块具有独立的作用域,可以通过 模块名.成员名 的方式访问模块中的成员。脚本则没有独立的作用域,被包含的脚本中的代码会直接插入到当前脚本中。
  • 导入和包含: 模块使用 import 语句导入,脚本使用 include 语句包含。
  • 执行时机: 模块在运行时导入,脚本在编译时包含。
  • 重用性: 模块可以被多个脚本重复使用,脚本则通常只被包含一次。
  • 组织方式: 模块通常用于组织相关功能的代码,脚本则通常用于组织特定的任务或流程。