Skip to main content
扩展函数把 target::method() 映射到 Java 侧实现,用于为特定宿主类型增加上下文能力(文件、集合、游戏对象等)。 核心代码分布在 FluxonRuntimeExtensionBuilderEnvironment

快速上手(Builder)

FluxonRuntime runtime = FluxonRuntime.getInstance();
runtime.registerExtension(File.class, "fs:io")
       .function("readText", 0, ctx -> ...)
       .async("copyTo", Arrays.asList(1, 2), ctx -> ...)
       .primarySync("deleteRecursively", 0, ctx -> ...);
  • function:同步扩展。
  • async:异步扩展(等价于 registerAsyncExtensionFunction)。
  • primarySync:主线程扩展。
ExtensionBuilder 只是语法糖,底层仍调用 FluxonRuntime 的注册方法。

直接注册

方法说明
registerExtensionFunction(type, name, paramCount, callable)同步扩展。paramCount 支持 intList<Integer>;命名空间可为 null
registerExtensionFunction(type, namespace, name, List<Integer>, callable)指定命名空间,需脚本侧 import
registerAsyncExtensionFunction(...)异步扩展。
registerSyncExtensionFunction(...)主线程扩展。
命名空间前缀会与函数名组合为脚本调用形态。 例如 fs:io + readText -> fs:io::readText()

查找与匹配流程

  1. 解释器确定 targetClass<?>
  2. Environment#getExtensionFunction 优先在烘焙的 systemExtensionFunctions 二维数组中按名称匹配。
  3. 若未命中,回退到 extensionFunctions(名称 -> Map<Class<?>, Function>)。
  4. 匹配顺序为精确类型,再尝试 isAssignableFrom,确保子类可复用父类扩展。

实战提示

  • 复杂类型示例可参考 core/src/main/java/org/tabooproject/fluxon/runtime/function/extensionPathCollection 等)。
  • 想支持索引访问 (obj[index]),需实现 IndexAccessor(详见运行时章节)。
  • 调试:Environment#getRootExtensionFunctions() 查看当前映射。
  • 若调用失败,检查是否遗漏 import 或命名空间不一致。
  • dumpFluxonCatalog 可确认导出签名。

相关链接