簡體   English   中英

在 Lua 中,如何將 nil 參數正確設置為某個默認值?

[英]In Lua, how to set a nil parameter to some default value correctly?

對於下面的 Lua 代碼:

local function foo(x, y, z)
    local x = x or true
    local y = y or 1234
    z = z or "default"
end

一直以為函數里面這三行的意思是:

如果 x/y/z 為零,則 x/y/z 設置為 true/1234/“默認”。 否則,它保持原樣。 因此,我在很多地方都有這樣的一行來將參數設置為某個默認值,以防它可能作為 nil 傳遞到函數中。

但是,在我的實驗中似乎並不完全正確。 我不確定我從哪里學到了這個 Lua 編碼概念。 如何正確地做到這一點?

只要您的 boolean(?) 變量x未初始化為false該方法就會起作用。 如果您只想對nil值使用默認值,則a or b方法是正確的。

如果您的變量可以為false ,則必須使用嚴格的 if-then 塊:

if x == nil then x = true end

您可以在lua wiki上看到更多關於三元運算符的方法/示例。

如果您希望能夠將nil作為參數傳遞,則存在一種更嚴格的方法(例如,您想區分foo(1,2,nil)foo(1,2)

function foo(...)
  local n,x,y,z = select('#', ...), ...
  if n < 3 then z = default end
  if n < 2 then y = default end
  if n < 1 then x = default end
  -- here x,y or z  can be nil
  ...
end

但是您必須確保您知道自己在做什么,因為對於您的函數的用戶來說,這可能不是預期的行為。

這應該按預期工作:

function foo(x, y, z)
    x = (x == nil) or x
    y = (y == nil and 1234) or y
    z = (z == nil and "default") or z
    print(x, y, z)
end

> foo()
true    1234    default
> foo(false, false, "me")
false   false   me
> foo(nil, 50, "me")
true    50  me

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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