[英]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.