【问题标题】:Lua - Should I use ":" when defining functions in tables if not using the "self" keyword?Lua - 如果不使用“self”关键字,我应该在表中定义函数时使用“:”吗?
【发布时间】:2019-05-09 04:56:47
【问题描述】:

这更像是一个设计哲学问题,因为我已经知道,如果函数在没有 self 关键字的情况下使用 . 定义,则不应使用 :(面向对象的语法糖)调用函数.但问题是使用我创建的库的程序员往往不阅读文档并遇到“我应该如何调用你的函数?”的问题,所以我最终总是使用以下方法定义函数:

local tbl = {};
function tbl:Add(a, b)
   return a + b;
end

我已经安装了 Luacheck(在 VS Code 中),当我使用这种语法而不使用 self 引用关键字时,它经常抱怨。它说:[luacheck] unused argument "self"。这在性能方面有什么问题(或者有没有办法在 VS Code 中禁用 Luacheck)?

相对于下面的风格,我更喜欢用这种风格编写函数:

function tbl.Add(_, a, b)
    return a + b;
end

在参数列表的开头添加一个虚拟变量似乎很痛苦。

编辑:另一个问题是,如果您有许多表实现了同名的函数并想要迭代它们,但有些实现不使用self 参数而其他实现呢?检查正确调用函数的表类型是非常乏味和糟糕的设计。

首选的风格是什么?总体上对这个警告有点困惑。你都有些什么想法呢?谢谢。

【问题讨论】:

  • : 用于对象方法和类方法,. 用于静态成员。
  • @EgorSkriptunoff 谢谢。我希望有一种更有表现力的方式来告诉用户“这是一个静态方法!不要使用:!”因为这似乎是人们在调用我的库中的函数时遇到的常见错误。我可以做到tbl.static.Add(),但这似乎既浪费又丑陋。我将不得不坚持文档并祈祷他们阅读它......
  • 符号./: 是方法签名的一部分,必须在文档中指定。无论如何,人们必须阅读文档以了解函数需要哪些参数。
  • @EgorSkriptunoff 另一个例子是,如果您希望许多表实现具有给定名称的函数(例如使用元表从同一个父类继承的子类)并且您想要遍历所有这些表并调用这个函数(使用相同的函数名),那么有些人可能会使用self,而其他人可能不会。这是一个很好的例子,说明了为什么我认为我应该忽略这个 luacheck 警告。我经常认为忽略这一点更安全。 – Mayron 10 分钟前
  • 从 Lua 代码的角度来看,只有整个源代码才能向函数的用户表达作者的意图。必须编写和阅读文档。这对于 return(s) 列表应该是显而易见的,但作为方法调用也是如此。总而言之,最小惊讶原则适用。因此,对于一个设计合理的库,文档将关注领域问题,而不是实现细节和过于聪明。 (一般意义上,定义为方法与否与是否调用方法无关。)

标签: function lua luacheck


【解决方案1】:

如果你不使用 self 参数,你可以这样做

function tbl.Add(a, b)
    return a + b;
end

无需使用虚拟变量。

你只需要确保你也用.而不是:来调用它
所以

local someValue = tbl.Add(1, 3)

例如而不是

local someValue = tbl:Add(1, 3)

【讨论】:

  • 我遇到的问题是我正在使用创建共享库,并且我认为期望用户/程序员正确调用方法/函数会使库更难使用,因为它依赖于它们来读取直接编码,或仔细阅读文档。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多