2011-05-16 111 views
70

在Lua中维基我找到了一种方法为缺少的参数的默认值:定义默认值,函数参数

function myfunction(a,b,c) 
    b = b or 7 
    c = c or 5 
    print (a,b,c) 
end 

这是唯一的办法? PHP风格myfunction (a,b=7,c=5)似乎不起作用。不是说Lua的方式不行,我只是想知道这是否是唯一的方法。

回答

62

如果你想命名参数和像PHP或者Python的默认值,你可以调用你的函数表的构造:

myfunction{a,b=3,c=2} 

(这被认为是在Lua的许多地方,如the advanced forms of LuaSocket's protocol modules和建设者。IUPLua

功能本身也有这样的签名:

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 

缺失F所列值从参数表中将从__index表中取得其元数据(参见the documentation on metatables)。

当然,使用表格构造函数和函数可以使用更高级的参数样式 - 您可以编写任何您需要的东西。例如,here是一个函数,它构造一个函数,该函数从定义参数名称和默认值的表以及采用常规参数列表的函数中获取命名或位置参数表。

作为非语言水平的功能,如呼叫可以被改变,以提供新的行为和语义:

  • 变量可以作出接受多个名称
  • 阵地变量和关键字变量(或导致错误)
  • 可以创建关键字无位置变量以及无名位置专用变量
  • 相当详细的表结构可以通过解析为特林
  • 参数列表可以逐字使用,如果调用函数时比1个表中的其他东西

一些有用的功能编写参数译员unpack(移动到table.unpack 5.2),setfenv(不建议使用5.2与新的_ENV构造)和select(它从给定参数列表返回单个值,或者使用'#'返回列表的长度)。

+0

我刚开始使用lua,我会保持简单的时间,但你的文章是非常丰富的。稍后可能会很方便。谢谢。 – ripat 2011-05-17 05:32:58

+1

在大多数情况下,保持简单是最好的选择。对于具有大量可选属性(如UI对象)的对象,元参数接口才是真正必需的。 – 2011-05-17 14:51:55

+0

我认为这个答案是解决问题的人,而不是当前被接受的人。感谢启发:) – Undo 2013-04-22 08:13:49

44

在我看来,没有别的办法。这只是Lua的心态:没有装饰,除了一些句法糖,没有多余的方式来做简单的事情。

+6

这个答案完全由下面斯图尔特P.宾利的答案,其中函数调用证伪一个表格构造函数。这是Lua的优势之一:Lua的基本构建块没有一些装饰,它可以让你做无限的事情,对于语言的小尺寸和简单性来说真的很棒。 – 2016-05-12 18:56:52

17

从技术上讲,有b = b == nil and 7 or b(这应该用在false是有效值的情况下,因为false or 7评估为7),但这可能不是您要查找的内容。

+1

如果您没有检查“false”,更简单的方法是先将变量放在最后,将默认值放在最后。 'b = b或7' – Rebs 2015-01-19 06:25:58

+1

由于OP提到在他们的问题中,我认为这是多余的提及(问题是关于如何定义默认变量*而不是* b = b或7')。 – 2015-01-25 01:21:29

5

我到目前为止发现的唯一方式,使任何意义就是做这样的事情:

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()