跳到主要内容

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))