Module lua模块-什么';“使用”的区别是什么&引用;及"&引用;什么时候定义函数?

Module lua模块-什么';“使用”的区别是什么&引用;及"&引用;什么时候定义函数?,module,lua,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 使用上述代码,无

我仍然在玩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

下面是我如何调用该方法的:

执行测试。lua

local x = require "test_suite"
x.create_widget(widgetname)
你能告诉我区别是什么吗?我一直在读:

但我没有遇到任何东西能解释这一点。
谢谢

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

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

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

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

元方法函数(具有
的函数)可以在lua表或C/C++绑定中生成。在非静态对象上,metamethod函数等于以下内容:

函数meta:Print() self:Remove() 结束

函数meta.Print(self) self:Remove() 结束

另外,使用
可以获得不需要从非静态或静态对象调用的数字/值。例如:

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

-- C:
int a()
{
    return 0;
}
-- Lua:
print(ent:a())
静态成员上的相同函数为:

print(entlib.a())

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

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

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

元方法函数(具有
的函数)可以在lua表或C/C++绑定中生成。在非静态对象上,metamethod函数等于以下内容:

函数meta:Print() self:Remove() 结束

函数meta.Print(self) self:Remove() 结束

另外,使用
可以获得不需要从非静态或静态对象调用的数字/值。例如:

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

-- C:
int a()
{
    return 0;
}
-- Lua:
print(ent:a())
静态成员上的相同函数为:

print(entlib.a())

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

冒号在函数声明中所做的一切就是添加一个隐式
self
参数。这只是一点语法上的甜点

因此,如果您使用(
mtests
表分配给
foo
),
foo.create_小部件(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

<>基本上是在java、C++、C++等语言中的<代码> static < /C>和成员方法之间的区别。

< p>所有冒号在函数声明中都添加了一个隐式的<>代码>“自我/代码>”参数。这只是一点语法上的甜点

因此,如果您使用(
mtests
表分配给
foo
),
foo.create_小部件(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

<>基本上是在java、C++、C++等语言中的<代码>静态<代码>和成员方法之间的区别。因此,如果我理解正确,如果我想保持“:”,我应该做一个“属性”,接受并赋值给“ARG1”。这是正确的吗?我在哪里可以得到关于这方面的其他文档?@dot调出Lua参考并搜索“self”,第一次点击解释了这一点。《Lua中的编程》(PIL)一书也讨论了这一点(参见Lua.org了解如何购买)。因此,如果我理解正确,如果我想保留“:”我应该创建一个“属性”,接受并为“arg1”赋值。这是正确的吗?我在哪里可以得到关于这方面的其他文档?@dot调出Lua参考并搜索“self”,第一次点击解释了这一点。Lua中的编程(PIL)一书也讨论了这一点(参见Lua.org了解如何购买)。你如何调用函数?ECrownofFire-我修改了我的帖子,以包含如何调用该方法的示例。你如何调用函数?ECrownofFire-我修改了帖子,以包含如何调用该方法的示例。