c - Lua 源代码是用干净的代码编写的吗?
问题描述
我最近在阅读Lua编程语言的源代码,发现一些约定不清楚或令人困惑。例如,此文件中的 str_reverse 函数。它是否被认为是 C 中的干净代码和可理解的代码?
static int str_reverse (lua_State *L) {
size_t l, i;
luaL_Buffer b;
const char *s = luaL_checklstring(L, 1, &l);
char *p = luaL_buffinitsize(L, &b, l);
for (i = 0; i < l; i++)
p[i] = s[l - i - 1];
luaL_pushresultsize(&b, l);
return 1;
}
在这些行中:
char *p = luaL_buffinitsize(L, &b, l);
for (i = 0; i < l; i++)
p[i] = s[l - i - 1];
*p 用于存储字符串反转后的值。之后,我看不到它在其他任何地方使用。然后查看char *p = luaL_buffinitsize(L, &b, l);
,它表明 *p 是 的一个属性luaL_Buffer b;
,现在可以理解为什么不再使用 *p 了,因为在下一行中,b
正在使用
此外,在这一行const char *s = luaL_checklstring(L, 1, &l);
中,此luaL_checklstring
函数返回*s
,但还将字符串的长度(从 L 获取)分配给size_t l
变量。所以这个函数不仅返回 1 个变量,而且还改变了 1 个变量。
解决方案
当你不知道某事是如何工作的时,一个合理的结论是它可能写得不好。但是,上面的代码是可读的。我对lua一无所知,对C的了解也不多,我能够破译发生了什么。
可能对您有所帮助的第一件事是了解如何str_reverse
调用,启动解释器:
> str = "foo" /* create a string in a lua state */
> string.reverse(str) /* indirectly invokes str_reverse */
oof /* result */
首先要做的str_reverse
是 call ,它是一个添加错误检查luaL_checklstring
的包装函数。lua_tolstring
在对话框中:
str_reverse
说luaL_checklstring
:
“嘿,我需要一个字符串 - 给我地址(存储在 中s
),我还需要长度(存储在 中l
)。”
luaL_checklstring
说:“是的,一切都很好——给你!”
您会看到,C 语言需要知道所有内容的大小,以便分配适当的内存量。由于str_reverse
需要为反转的字符串分配内存(更准确地说,luaL_Buffer b
如果它不够大以容纳字符串,则需要调整大小),它也告诉luaL_checklstring
给出长度。如果str_reverse
不关心长度NULL
将被传递而不是l
. 这就是 Lua API 的设计方式——对我来说似乎是可读的。
p
不存储字符串的值 - 反转的字符串b
作为成员存储在 , 中。p
基本上是一个捷径,考虑以下几点:
/* disregard the pointer returned by buffinitsize */
luaL_buffinitsize(L, &b, l);
for (i = 0; i < l; i++)
b->b[i] = s[l - i - 1];
上面的代码应该是一样的。除了现在,血淋淋的细节luaL_Buffer
暴露了……不是很好。
您需要阅读指针。如果你不理解指针,你永远不会完全理解C,就像没有脚走路一样。
无论如何,很糟糕你被否决了这么多,这可能是你为你的问题选择的标题——听起来你在抨击 Lua。除此之外,您的问题似乎是真实的 - 祝您好运,并在您阅读他人代码的冒险中获得乐趣!
推荐阅读
- python - 如何正确编写 if 语句 - Python
- windows - 如何在 VB.Net 应用程序中嵌入图标,以便它们可以用作快捷方式图标?
- javascript - 如何根据用户当前所在的页面部分对链接进行颜色更改?
- angularjs - 使用 Tailwind 的交互式汉堡菜单
- nuget - Nuget 还原提示“此应用无法在您的 PC 上运行”
- npm - 使用 npm 在 ubuntu 20 上安装无服务器会出现错误
- flutter - Flutter 远程日志记录
- sass - Node-sass 未编译
- python - RuntimeWarning 的 Pandas 错误问题
- javascript - 在不滚动 iFrame 父级的情况下将滚动反应到 Element 底部