Lua - 函数声明的变化

我对 Lua 还比较新,并且对如何声明函数感到有些困惑。

这两种变化似乎都可以工作:-

第一种变化

test = {calc = function (x,y)
    z = x + y
    return z
end
}

result = test.calc (1,2)
print (result)

第二种变化

test = {}

function test.calc(x,y)
  z = x + y
  return z
end

result = test.calc (1,2)
print (result)

选择特定变化方式是否有任何影响?

点赞
用户107090
用户107090

它们具有完全相同的效果。根据可读性选择其中之一(我更喜欢第二种)。

2017-10-24 15:20:43
用户2226988
用户2226988

Lua 没有函数声明。它有函数定义,这是一种表达式(第一种变体),在运行时求值生成一个函数值。其他的语法形式实际上是函数定义表达式和赋值的结合。

在这个第三种变体中,它加上了一个隐含的第一个参数 self。它被设计为在字段上执行 "方法调用" 时使用。方法调用只是通过将持有字段的表格值(函数值)作为隐含的第一个参数传递的函数调用的另一种形式,使得函数可以引用它,特别是访问其它字段。

第三种变体:方法

local test = { history = {} }

function test:calc(x,y)
  local z = x + y
  table.insert(self.history, { x = x, y = y })
  return z
end

print(test.calc)
local result = test:calc(1,2)
print(result)
print(test.history[1].x, test.history[1].y)
2017-10-25 01:00:16