【发布时间】: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) 列表应该是显而易见的,但作为方法调用也是如此。总而言之,最小惊讶原则适用。因此,对于一个设计合理的库,文档将关注领域问题,而不是实现细节和过于聪明。 (一般意义上,定义为方法与否与是否调用方法无关。)