我还在玩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
但我没有遇到过任何可以解释这个问题的事。 谢谢。
答案 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())
基本上,每个具有可调用功能的非静态对象都将转换为:
以便更好地使用。