lua模块 - 使用“:”和“。”之间的区别是什么。在定义函数时?

时间:2013-12-18 20:28:40

标签: module lua

我还在玩lua模块,我发现以下“有趣”的问题取决于你在模块中创建方法/函数的方式。 请注意名为test_suite.lua的文件中的以下代码:

local mtests = {} -- public interface

function mtests:create_widget(arg1)
 print(arg1)
 -- does something
 assert(condition)
 print("TEST PASSED")
end
 return mtests

使用上面的代码,无论我在调用create_widget()时传入什么,arg1总是为nil。但是,如果我将函数的定义更改为如下所示:

function mtests.create_widget(arg1) -- notice the period instead of colon
 print(arg1)
 -- does something
 assert(condition)
 print("TEST PASSED")
end

然后,系统正确显示arg1。

这就是我调用方法的方法:

execute_test.lua

local x = require "test_suite"
x.create_widget(widgetname)

你能告诉我有什么不同吗?我一直在读:http://lua-users.org/wiki/ModuleDefinition

但我没有遇到过任何可以解释这个问题的事。 谢谢。

3 个答案:

答案 0 :(得分:5)

函数声明中的所有冒号都会添加一个隐式self参数。这只是一些语法糖。

因此,如果您使用(假设您将mtests表格分配给foo),foo.create_widget(bar),则bar实际分配给self },arg1未分配,因此nil

foo = {}
function foo:bar(arg)
    print(self)
    print(arg)
end

将其称为foo.bar("Hello")打印出来:

Hello
nil

但是,将其称为foo:bar("Hello")foo.bar(foo, "Hello")会为您提供:

table: 0xDEADBEEF (some hex identifier)
Hello

它基本上是static与Java,C#,C ++等语言中的成员方法之间的区别。

答案 1 :(得分:0)

使用:或多或少类似于使用this或self引用,并且您的对象(表)上没有定义arg1(就像成员一样)。另一方面,使用。就像定义作为表的一部分的函数或方法(如果你愿意,可能是静态视图),然后它使用在其上定义的arg1。

答案 2 :(得分:0)

.定义静态方法/成员,静态库,这意味着您无法创建它的新对象。静态方法/库仅用于具有一些自定义功能,如从Web打印或下载文件,清除内存和...

:用于对象成员,非静态成员。这些成员更改对象中的某些内容,例如清除指定的文本框,删除对象和...

Metamethod函数(具有:的函数)可以在lua表或C / C ++ Bindings中生成。 metame方法函数在非静态对象上等于这样的东西:

function meta:Print()     自:删除() 端

function meta.Print(self)     自:删除() 端

此外,使用.,您可以获得不需要来自非静态或静态对象的任何调用的数字/值。例如:

-- C:
int a = 0;
-- Lua:
print(ent.a)

-- C:
int a()
{
    return 0;
}
-- Lua:
print(ent:a())

静态成员上的相同功能是:

print(entlib.a())

基本上,每个具有可调用功能的非静态对象都将转换为:以便更好地使用。