簡體   English   中英

從C中的Lua函數返回'nil'與返回0值

[英]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 (但沒有發生錯誤)。

(這不是答案,只是關於這個問題的意見)

對於我來說,這之間的差別人工nilno 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM