我是Lua
的初学者,我对()
的使用感到困惑。
以下是Lua5.3
的一些示例。
a = '%s %s'
a:format("Hello", "World") -- Hello World
'%s %s':format("Hello", "World") -- stdin:1: unexpected symbol near ''%s %s''
('%s %s'):format("Hello", "World") -- Hello World
type(a) == type('%s %s') -- true
getmetatable(a) -- table: 0x1f20bf0
getmetatable('%s %s') -- table: 0x1f20bf0 for any other hard coded strings
问题:
()
对硬编码字符串做了什么?答案 0 :(得分:4)
第一个示例中使用函数调用强制使用括号(或变量)是由于Lua语法规则:这只是语法语法的定义方式,而不是遵循语法/解析错误中定义的语法结果
请参阅Section 2.5.8 – Function Calls, of the Lua Reference。
Lua中的函数调用具有以下语法:
functioncall ::= prefixexp args
在函数调用中,首先计算prefixexp和args。如果prefixexp的值具有type函数,则使用给定的参数调用此函数。否则,调用prefixexp“call”元方法,将prefixexp的值作为第一个参数,后跟原始调用参数(参见§2.8)。
表格
functioncall ::= prefixexp `:´ Name args
...
prefixexp ::= var | functioncall | ( exp )
也就是说,prefixexp
不能是String
(或任何其他)文字,但可以是变量({{1 }});或括号内的任何表达式 (var
);甚至链接函数调用(( expr )
)..
由于以下作品,允许在functioncall
位置使用String
(或任何其他)文字:
args
作为示例的一个补充案例,请注意args ::= `(´ [explist] `)´ | tableconstructor | String
explist ::= {exp `,´} exp
制作有一个特殊情况,如果单 {不需要括号{1}}字面意思。因此,即使看似奇怪,以下内容也是有效的:
args