跳到主要内容

dyn

dyn 库提供动态执行与模块导入能力,允许在运行时求值 yak 代码、从 .yak 文件导入变量/函数,实现脚本的动态加载与组合。

典型使用场景:

  • 动态求值:dyn.Eval 在当前运行时执行一段 yak 代码。
  • 模块导入:dyn.Import 从文件导入导出项,dyn.LoadVarFromFile 加载文件中的变量(可配 dyn.params 传参、dyn.recursive 递归)。
  • 类型判断:dyn.IsYakFunc 判断某值是否为 yak 函数。

与相邻库的关系:dyn 提供脚本级的动态能力,常用于插件框架、把多个 .yak 文件组合调用的场景,与 hook(插件调用)思路互补。

共 6 个函数

函数索引​

函数参数返回值说明
dyn.Evali anyerror动态执行一段 yak 代码
dyn.Importfile string, exportsName stringany, error从指定 yak 文件中加载并导入名为 exportsName 的变量
dyn.IsYakFunci anybool判断传入的值是否为一个函数(包括 yak 函数与原生函数)
dyn.paramsi map[string]anyyakEvalConfigOpt生成一个 LoadVarFromFile 的配置项,为被加载脚本注入额外参数
dyn.recursivei boolyakEvalConfigOpt生成一个 LoadVarFromFile 的配置项,控制是否递归遍历子目录加载脚本

可变参数函数索引​

函数参数返回值说明
dyn.LoadVarFromFilepath string, exportsName string, opts ...yakEvalConfigOpt[]*yakVariable, error从指定文件或目录中批量加载脚本,并提取每个脚本中名为 exportsName 的变量

函数详情​

Eval​

Eval(i any) error

动态执行一段 yak 代码

参数

参数名类型说明
iany要执行的 yak 代码(字符串或字节切片)

返回值

序号类型说明
r1error执行过程中产生的错误,成功时为 nil

示例

// VARS: 动态执行一段代码
err = dyn.Eval("a = 1 + 1")
// assert: 合法代码执行无错误
assert err == nil, "valid code should evaluate without error"

Import​

Import(file string, exportsName string) (any, error)

从指定 yak 文件中加载并导入名为 exportsName 的变量

参数

参数名类型说明
filestringyak 文件路径(可省略 .yak 后缀)或包含 main.yak 的目录
exportsNamestring要导入的变量名

返回值

序号类型说明
r1any导入的变量值
r2error加载失败时返回的错误

示例

// 从 ./mod.yak 导入名为 Exports 的变量(依赖外部文件,作示意)
v, err = dyn.Import("./mod", "Exports")

IsYakFunc​

IsYakFunc(i any) bool

判断传入的值是否为一个函数(包括 yak 函数与原生函数)

参数

参数名类型说明
iany待判断的值

返回值

序号类型说明
r1bool是否为函数

示例

// STDOUT: 函数返回 true
println(dyn.IsYakFunc(func() { return 1 })) // OUT: true
// assert: 非函数返回 false
assert dyn.IsYakFunc(123) == false, "an integer is not a function"

params​

params(i map[string]any) yakEvalConfigOpt

生成一个 LoadVarFromFile 的配置项,为被加载脚本注入额外参数

参数

参数名类型说明
imap[string]any注入到被加载脚本中的参数键值表

返回值

序号类型说明
r1yakEvalConfigOpt可传给 dyn.LoadVarFromFile 的配置项

示例

// 注入参数后加载脚本中的 Exports 变量(作示意)
vars, err = dyn.LoadVarFromFile("./mod", "Exports", dyn.params({"key": "value"}))

recursive​

recursive(i bool) yakEvalConfigOpt

生成一个 LoadVarFromFile 的配置项,控制是否递归遍历子目录加载脚本

参数

参数名类型说明
ibool是否递归加载子目录中的 yak 文件

返回值

序号类型说明
r1yakEvalConfigOpt可传给 dyn.LoadVarFromFile 的配置项

示例

// 递归加载目录下所有脚本中的 Exports 变量(作示意)
vars, err = dyn.LoadVarFromFile("./mods", "Exports", dyn.recursive(true))

可变参数函数详情​

LoadVarFromFile​

LoadVarFromFile(path string, exportsName string, opts ...yakEvalConfigOpt) ([]*yakVariable, error)

从指定文件或目录中批量加载脚本,并提取每个脚本中名为 exportsName 的变量

必填参数

参数名类型说明
pathstringyak 文件路径或目录(目录会遍历其中的 .yak 文件)
exportsNamestring要从每个脚本中提取的变量名

可选参数

参数名类型说明
opts...yakEvalConfigOpt可选配置,如 dyn.params(...)、dyn.recursive(...)

返回值

序号类型说明
r1[]*yakVariable提取到的变量列表,每个元素包含文件路径、模块名与变量值
r2error加载失败时返回的错误

示例

// 从目录加载所有脚本的 Exports 变量(依赖外部文件,作示意)
vars, err = dyn.LoadVarFromFile("./mods", "Exports", dyn.recursive(true))