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
点赞
用户2864740
用户2864740

第一个示例中函数调用中圆括号(或变量)的强制使用是由于Lua语法规则:这只是语言语法定义的方式,不遵循定义的语法会导致语法/解析错误。

请参阅第2.5.8节-函数调用,Lua ​​Reference

Lua中的函数调用具有以下语法:

functioncall ::= prefixexp args

在函数调用中,首先评估前缀运算符和参数。如果前缀运算符的值具有函数类型,则使用给定的参数调用此函数。否则,调用前缀call元方法,第一个参数是前缀的值,后跟原始调用参数(请参见§2.8)。

表格结构如下

functioncall ::= prefixexp `:´ Name args

..

其中prefixexp 定义为:

prefixexp ::= var | functioncall | ( exp )

也就是说,prefixexp不可以是一个字符串(或任何其他)字符,但它可以是一个变量(var);或在括号内的任何表达式((expr));甚至是链接函数调用(functioncall)......

在参数的位置使用字符串(或任何其他)文字是允许的,因为它符合以下生成的条件:

args ::=  `(´ [explist] `)´ | tableconstructor | String
explist ::= {exp `,´} exp

作为示例的补充,注意到参数args生产中有一种特殊情况,如果它是一个单一的字符串(literal),则不需要括号。因此,即使看起来有点奇怪,以下内容仍然有效:

('Hello %s'): format "World!"
2018-01-08 03:04:42