从 `require(file)` 加载值到本地变量

抱歉如果这是一个常见问题,但如果一些 lib.lua 返回本地函数的表,例如

return {readCsv=readCsv, sumList=sumList, printHelp=printHelp}

并且 file2.lua 使用

local lib=require("lib")

导入它,是否有一种程序化的方法自动将 lib 值加载到本地空间中?因此,我不必一遍又一遍地执行

local readCsv,sumList,printHelp=lib.readCsv,lib.sumList,lib.printHelp

我知道在 LUA 中这是标准操作,它通常不会惹恼太多人。但它经常发生,所以我想知道是否有标准的快捷方式。

(注意:为了明确起见,我知道如何将它们加载到 _ENV 中使它们成为 全局变量,但这恰恰不是我想要的。)

原文链接 https://stackoverflow.com/questions/69877701

点赞
stackoverflow用户1442917
stackoverflow用户1442917

因为返回的只是一个常规的表,你可以通过“解包”这个表把它转变成一个值列表:

-- 作为数组和哈希表返回值
return {readCsv, sumList, printHelp,
  readCsv=readCsv, sumList=sumList, printHelp=printHelp}

-- 然后进行如下操作
local readCsv,sumList,printHelp = (table.unpack or unpack)(require "lib")

返回/分配值的顺序显然很重要。

如果有人还想使用“常规”的语法local lib = require "lib",它仍然可以工作。

2021-11-08 02:24:53
stackoverflow用户734069
stackoverflow用户734069

在 Lua 中,本地变量是静态声明的结构。它们在编译时已知,一般情况下无法在运行时分配。即使是每个函数所持有的本地变量的数量在编译时也已知,即使在创建函数对象之前它们所持有的值尚未知。

因此,没有动态机制可以将表的内容转储到运行时定义的本地变量数量中。

最接近的方法是手动解析 Lua 脚本 _文本_,以找到所有的 require 语句,自己执行这些 require,并解析表以生成一系列 local 声明,然后将其插入到 Lua 脚本文本的适当位置中。然后,您将编译该脚本并使用它。

但是这是一个巨大的工作,只是为了摆脱 lib.,不值得这样做。

2021-11-08 03:19:04
stackoverflow用户1505323
stackoverflow用户1505323

基于上面的内容,我编写了一个简化导入的函数。现在,我有点同意@NicolBolas的看法,这可能有点“分号癌症”,但是这个函数很短,而且是可选的(只有几行代码,并不影响通常的LUA模块约定)

get“文件名”会导入文件并按字母顺序拆分结果。类似于Python命令

from file import *

get“file thing1 thing2…”会导入文件并仅拆分thing1和thing2。类似于Python命令

from file import thing1,thing2

例如,这里是一个返回一些代码的文件:

-- file = cc.lua
function fun1() print(1) end
function fun2() print(2) end
function fun3() print(3) end
function fun4() print(4) end
function fun5() print(5) end

return  {fun3=fun3, fun1=fun1, fun2=fun2, funs5=fun5, fun4=fun4}

这里是一个使用示例(全部拆分)。请注意,子模块(cc.lua)可以以任何顺序返回其内容,而此代码将按字母顺序拆分它们:

-- file = gettest1.lua
local get=require"get"
local fun1,fun2,fun3,fun4,fun5=get"cc"

fun5()

这里是另一个用法,我们可以以任何顺序拆分一些内容:

-- file = gettest2.lua
local get=require"get"
local fun3,fun1=get"cc fun3 fun1"

fun1()

这里是保存get函数的get.lua文件的代码

-- file = get.lua
local function get(spec)
  local gets, keys,out={},{},{}
  for get in string.gmatch(spec, "([^ ]+)") do gets[#gets+1]= get end
  local results = require(table.remove(gets,1))
  if   #gets>0
  then  keys= gets
  else  for key,_ in pairs(results) do keys[#keys+1] = key end
        table.sort(keys)
  end
  for _,key in ipairs(keys) do out[#out+1] = results[key] end
  return table.unpack(out)
end

return get

改进?建议?评论?

2021-11-08 16:10:20