【问题标题】:how do I collect the function return in load如何在负载中收集函数返回
【发布时间】:2020-12-08 04:39:57
【问题描述】:

我现在开始研究 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() 执行功能并收集他们的return

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

hello = "Hello World"

print(load("hello"))

但他给出了这个错误:

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

有人知道我怎么能做到这一点吗?感谢您的关注!

【问题讨论】:

  • 如果load 返回一个函数,也许你应该调用它? print(load("return 5+3")()) 看起来很有希望....
  • @exnihilo 成功了,非常感谢您的精彩回答

标签: function variables lua runtime-error


【解决方案1】:

当您将字符串传递给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)调用的是chunk返回的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2020-07-20
    • 1970-01-01
    • 2013-06-27
    • 2018-04-27
    相关资源
    最近更新 更多