在Lua中调用绑定方法时,字符串括号的用法是什么?

时间:2018-01-08 02:52:04

标签: lua

我是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 

问题:

  1. ()对硬编码字符串做了什么?
  2. 否则,只有语法错误? :D

1 个答案:

答案 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 is defined为:

prefixexp ::= var | functioncall | ( exp )

也就是说,prefixexp 不能String(或任何其他)文字,但可以是变量({{1 }});或括号内的任何表达式 var);甚至链接函数调用(( expr ))..

由于以下作品,允许在functioncall位置使用String(或任何其他)文字:

args

作为示例的一个补充案例,请注意args ::= `(´ [explist] `)´ | tableconstructor | String explist ::= {exp `,´} exp 制作有一个特殊情况,如果 {需要括号{1}}字面意思。因此,即使看似奇怪,以下内容也是有效的:

args