【问题标题】:lua modules - what's the difference between using ":" and "." when defining functions? [duplicate]lua 模块 - 使用“:”和“。”有什么区别?定义函数时? [复制]
【发布时间】:2014-01-07 04:46:09
【问题描述】:

我仍在使用 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

但我没有遇到任何可以向我解释这一点的东西。 谢谢。

【问题讨论】:

  • 你是怎么调用函数的?
  • ECrownofFire - 我已经修改了我的帖子以包含我如何调用该方法的示例。

标签: module lua


【解决方案1】:

在函数声明中,冒号所做的只是添加一个隐含的self 参数。这只是一点语法糖。

因此,如果您调用它(假设您将mtests 表分配给foofoo.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++ 等语言中的成员方法之间的区别。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      元方法函数(具有: 的函数)可以在 lua 表或 C/C++ 绑定中创建。元方法函数在非静态对象上等于这样:

      函数元:打印() 自我:删除() 结束

      函数 meta.Print(self) 自我:删除() 结束

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

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

      静态成员上的相同函数是:

      print(entlib.a())
      

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

      【讨论】:

      • 所以如果我理解正确,如果我想保留“:”,我应该创建一个“属性”,接受并为“arg1”赋值。这是正确的吗?
      • 我在哪里可以获得一些额外的文档?
      • @dot 提取 Lua 引用 lua.org/manual/5.1/manual.html 并搜索“self”,第一次点击解释了这一点。 Programming in Lua (PIL) 一书也讨论了这一点(参见 lua.org 了解如何购买)。
      猜你喜欢
      • 2020-05-05
      • 2011-06-13
      • 2014-12-21
      • 1970-01-01
      • 2012-08-02
      • 2012-01-21
      • 2017-06-29
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多