在 Lua 中,a = Account:new{balance = 0}是如何工作的?还是打错了?

在 Lua 的网站 https://www.lua.org/pil/16.1.html 上,有这段代码

function Account:new (o)
  o = o or {}   -- 如果没有提供,则创建对象
  setmetatable(o, self)
  self.__index = self
  return o
end

a = Account:new{balance = 0}
a:deposit(100.00)

应该不应该将a = Account:new{balance = 0}这一行写成a = Account:new(balance = 0),并将括号替换为括号,因为它是一个函数?

点赞
用户2505965
用户2505965

Account:new { balance = 0 } 这段代码是用来简化写法的,实际上它等价于 Account:new({ balance = 0 })

也就是说,当一个函数的唯一参数是一个 构造器字符串字面量 时,可以省略圆括号。

require 中,最常见的使用就是省略掉圆括号了:

local env = require 'env'

这个用法在 Lua 参考手册§3.4.10 – Function Calls 中有讨论:

f{fields} 表示对 f({fields}) 的一种语法糖;相当于一个参数列表仅包含一个新 table。f'string' (或 f"string"f[[string]]) 表示对 f('string') 的一种语法糖;相当于一个参数列表仅包含一个字符串字面量。

2016-11-06 23:56:01