如何在load中收集函数返回值

我现在开始学习lua中的load()函数,但我无法获取该函数返回的值

我尝试了下面两种方法来执行load()函数并收集值

function sumvalues()
    return 5+3
end

local func = "sumvalues()"

print(load(func))

local func = "return 5+3"

print(load(func))

但它们都只返回函数,而不是返回值

function: 0000000000cf0e50
function: 0000000000cf0df0

有没有人知道我如何在load()中执行函数并收集其返回值

我还想知道如何使用与变量相同的字符串名称在load()中收集变量,我尝试过这样做:

hello = "Hello World"

print(load("hello"))

但他会输出以下错误:

nil [string "hello"]:1: syntax error near <eof>

是否有人知道我如何实现这个功能?感谢您的关注!

点赞
用户6879826
用户6879826

当您将字符串传递给 load 时,该代码块会在全局环境中编译,并返回一个执行该代码块的函数。要执行该代码块,您必须调用该函数:

> function sumvalues()
>> return 5+3
>> end
> func = "return sumvalues()"
> load(func)
function: 0x55e069c2a490
> load(func)()
8

在此示例中,func 是一个字符串,被视为一个代码块,并由 load 编译为返回调用 sumvalues 后的值的函数体。请注意,由于 load 在全局环境中编译其代码块,因此 local func = "return sumvalues()" 无法工作,因为 funcload 不可见。

另一个示例:

> hello = "return 'Hello World'"
> load(hello)()
Hello World
> print(load(hello))
function: 0x55e069c53580
> print(load(hello)())
Hello World

在这个示例中,代码块 "return 'Hello World'" 被编译为返回字符串 'Hello World' 的函数。您可以调用该函数,打印该函数的值,或打印调用该函数后返回的值。

如果在代码字符串前面添加 "return " 看起来工作量太大,您可以创建一个名为 chunkify 的函数:

function chunkify (s)
  return "return " .. s
end

> load(chunkify("5+3"))()
8
> load(chunkify("'Hello World'"))()
Hello World

您仍在传递包含要运行的代码的字符串,因此该代码中的任何字符串也需要加引号。

> load(chunkify("function (x) return 2*x end"))()(21)
42

load 返回的函数不需要任何参数,但是您可以使用 load 创建这样的函数,方法是编译块本身返回需要参数的函数。必须调用由 load 返回的函数才能访问感兴趣的实际函数。在上面的示例中,请注意使用第一个 () 调用由 load 返回的函数,并使用 (21) 调用代码块返回的函数。

2020-08-19 00:15:31