首页 > 解决方案 > 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 个变量。

标签: cluaprogramming-languagescode-cleanup

解决方案


当你不知道某事是如何工作的时,一个合理的结论是它可能写得不好。但是,上面的代码是可读的。我对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_reverseluaL_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。除此之外,您的问题似乎是真实的 - 祝您好运,并在您阅读他人代码的冒险中获得乐趣!


推荐阅读