导入一堆 Lua 名称

在我的脚本中,我遵循从另一个模块“导入”函数的方法。因此,我在脚本开头有类似如下的代码:

local some_function = assert(require("utils").some_function)
local another_func = assert(require("utils").another_func)
local yet_another = assert(require("utils").yet_another)
local and_another = assert(require("utils").and_another)

但是这段代码并不太易读。

assert()是为了防止函数名称拼写错误。)

我知道我可以很容易地编写自己的函数,例如require_names(),并将上面的代码转换为:

local some_function,another_func,yet_another,and_another
  = require_names(“utils”,{“some_function”,“another_func”,“yet_another”,“and_another”})

这看起来非常好。尽管如此,它还不是最佳选择:这段代码中存在冗余:函数名称重复两次。

有没有办法使我的“require_names()”不具有冗余问题?

或者,您有解决可读性问题的其他方法吗?

(我需要在Lua 5.1和5.2上运行的解决方案)

点赞
用户869951
用户869951

如果你只想使用 utils 模块中的一部分,但是只创建本地变量,则不行。其他答案会给你整个 utils 模块,在这种情况下,我不明白为什么不直接使用 require 'yourmodule'。如果你可以放弃本地变量,则:

function require_names(modName, objNames)
    for i,v in ipairs(objNames)  do
         _G[v] = assert(require(modName)[v])
    end
end

可以在 5.1 中使用:

> print(setn)
nil
> print(insert)
nil
> require_names("table", {"setn", "insert"})
> print(setn)
function: 005F7910
> print(insert)
function: 005F7890

唯一的非全局选项是将你需要的内容放入一个本地表中,以获取你需要的子集:

function require_names(modName, objNames)
    local mod = {}
    for i,v in ipairs(objNames) do
         mod[v] = assert(require(modName)[v])
    end
    return mod
end

local utils = require_names("utils", { 'a', 'b' })
utils.a = asdfasf
print(utils.b)

但与 local utils=require 'utils' 相比,以上方法的唯一好处是它记录了你从所需的模块中要使用哪些内容。但是,由于所有的引号和花括号,这样做有点嘈杂。

2014-02-06 16:44:53
用户312586
用户312586

我会这样做:

local u = require 'utils'

然后像这样使用它:

u.some_function(...)

这非常容易键入并且非常明显。

如果您真的需要 locals,那么我不会使用一个叫做 require_names 的单个函数,而是两个函数:常规的 requireextract。这是 extract

local function extract(t, keys)
  local values = {}
  for i=1, #keys do values[i] = t[keys[i]] end
  return unpack(values)
end

用法:

local utils = require 'utils'
local some_function, another_func, yet_another, and_another =
  extract(utils, { "some_function", "another_function", "yet_another", "and_another"})
2014-02-06 16:51:15