[英]Lua C API: Retrieve values from Lua function returning a table in C code
[英]Returning 'nil' from a Lua function in C vs returning 0 values
一些Lua函数返回nil
以通知用户该函数无法执行某些任务(例如, tonumber()
, string.find()
)。
在C中,returnig nil
是这样完成的:
int some_function(lua_State* L) {
...
if (some condition) {
lua_pushnil(L);
return 1;
}
...
}
但是,我想知道是否可以做以下事情:
int some_function(lua_State* L) {
...
if (some condition) {
return 0;
}
...
}
它更短。 我尝试了它似乎有效,但我不知道这是否是按设计的。 我检查了Lua的源代码,我没有看到这个return 0
模式,所以我想知道这样做是否合法。
返回nil
的两种不同方式是否相同?
(顺便说一句,我知道所有关于通过异常发出的信号错误(即lua_error()
)所以请不要提及它。)
更新:
我现在看到两种方法之间存在细微的差别: print((function() end)())
什么都不print((function() return nil end)())
而print((function() return nil end)())
会打印“nil”。 我不知道这有多重要。
Lua中的函数可能返回nil
但也可能不返回任何内容,并且这种行为并不完全等效,尽管在大多数情况下会产生相同的结果。
以下Lua脚本向您展示了如何检测函数返回的返回值的数量:
local function PrintNRetVals( ... )
local nargs = select( '#', ... )
print( "Number of values returned: " .. nargs )
end
local function ReturningSomething()
return "hello"
end
local function ReturningNil()
return nil
end
local function ReturningNothing()
return
end
PrintNRetVals( ReturningSomething() ) --> 1
PrintNRetVals( ReturningNil() ) --> 1
PrintNRetVals( ReturningNothing() ) --> 0
我说行为几乎是等价的,因为只要你尝试为一个变量分配一个函数的结果,变量在两种情况下都会得到nil
,因此后续的代码将无法区分。 但是,正如我上面所示,如果你真的需要,你可以发现差异。
是的,这是完全有效的。 如果您尝试请求/分配的返回值多于(无论您是尝试获得一个还是十个),那么对于未定义的(即未返回的那些),您将获得nil
。
function test1()
return 5
end
local a, b = test1()
-- a = 5, b = nil
function test2()
return 1, 2
end
local c, d, e = test2()
-- c = 1, d = 2, e = nil
function test3()
end
local f, g = test3()
-- f = nil, g = nil
您可能无法在Lua的源代码中找到它,因为它不是特例或任何特殊情况。 这只是Lua处理返回值的通用方法。
更新:
您在尝试打印返回值时注意到的差异是,这不仅仅是一项任务。 当然,在返回nil
和返回任何内容之间存在细微差别 - 并且可以在那里区分。 最后,您必须确保正确记录您的功能行为,即告诉用户应该发生什么。 例如,返回nil
(或得到nil
在分配中)可以代表一个错误状态,但它也有可能没有的情况下,返回的决定有错误,返回nil
,如果某个值应该是无效的或nil
(但没有发生错误)。
(这不是答案,只是关于这个问题的意见)
对于我来说,这之间的差别人工nil
和no value
是不一致的,相当恼人。
local function f1() return nil end
local function f0() end
local v1 = f1() -- OK, assigns nil
print(type(f1())) -- OK, prints 'nil'
local v0 = f0() -- OK, assigns nil
print(type(f0())) -- Why the hack it raises an error?
恕我直言,函数的参数传递必须完全符合赋值语句的语义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.