Function ally是参数默认值的真正等价物,但它只是一个简单的解决方法,仅当nil和false都是无效的参数值时才有效。假设布尔参数x的默认值为true,调用方传递一个显式的false。然后x或true给出true,即使false被显式传递。更好的版本是,如果x==

Function ally是参数默认值的真正等价物,但它只是一个简单的解决方法,仅当nil和false都是无效的参数值时才有效。假设布尔参数x的默认值为true,调用方传递一个显式的false。然后x或true给出true,即使false被显式传递。更好的版本是,如果x==,function,lua,Function,Lua,ally是参数默认值的真正等价物,但它只是一个简单的解决方法,仅当nil和false都是无效的参数值时才有效。假设布尔参数x的默认值为true,调用方传递一个显式的false。然后x或true给出true,即使false被显式传递。更好的版本是,如果x==nil,那么x=defaultend,这也更具可读性;但是它仍然不能处理显式nil参数。哦,嘿,这是现在公认的答案!美好的(为了记录在案,并且把@Undo的评论放在上下文中,jpjacobs下面的答案在很长一段时间内都是被接受的答案:我几乎忘记


ally是参数默认值的真正等价物,但它只是一个简单的解决方法,仅当
nil
false
都是无效的参数值时才有效。假设布尔参数
x
的默认值为
true
,调用方传递一个显式的
false
。然后
x或true
给出
true
,即使
false
被显式传递。更好的版本是
,如果x==nil,那么x=defaultend
,这也更具可读性;但是它仍然不能处理显式
nil
参数。哦,嘿,这是现在公认的答案!美好的(为了记录在案,并且把@Undo的评论放在上下文中,jpjacobs下面的答案在很长一段时间内都是被接受的答案:我几乎忘记了。)如果你不检查
false
,一个更简单的方法是将变量放在第一位,默认值放在最后
b=b或7
因为OP在他们的问题中提到了这一点,我认为这是多余的(问题是关于如何定义默认变量而不是
b=b或7
)。Stuart P.Bentley在下面的回答中完全否定了这个答案,在这个回答中,函数是用表构造函数调用的。这是Lua的优势之一:虽然它没有一堆虚饰,但Lua的基本构建块允许你做无限的事情,语言的小尺寸和简单性真的很了不起。@ColinDBennett感谢你的发言:看起来OP会阅读你的评论,并且,在那年12月,相应地更改了接受的答案。(为了清晰起见,现在是“斯图尔特·P·本特利的答案”,wink:)
function myfunction(a,b,c)
    b = b or 7
    c = c or 5
    print (a,b,c)
end
myfunction{a,b=3,c=2}
function myfunction(t)
    setmetatable(t,{__index={b=7, c=5}})
    local a, b, c =
      t[1] or t.a, 
      t[2] or t.b,
      t[3] or t.c
    -- function continues down here...
end
function new(params)
  params = params or {}
  options = {
    name = "Object name"
  }

  for k,v in pairs(params) do options[k] = v end

  some_var = options.name
end

new({ name = "test" })
new()
function args(a1 [,a2])
-- some
end
function args ( a1 [,a2[,a3]])
-- some
end