Confusing Behaviors in Lua C API

💡 原文英文,约600词,阅读约需2分钟。
📝

内容提要

Lua 中没有单独的整数类型,整数是数字的一种。数字可以被视为字符串,反之亦然。`lua_tostring` 会将数字转换为字符串。轻量级用户数据是用户数据的一种,尽管类型 ID 不同,但共享同一类型名称“userdata”,且没有单独的元表,所有轻量级用户数据共享一个默认未设置的元表。

🎯

关键要点

  • Lua 中没有单独的整数类型,整数是数字的一种。

  • 数字可以被视为字符串,反之亦然。

  • lua_tostring 会将数字转换为字符串,调用后类型会变为字符串,但仍然被视为数字。

  • lua_isinteger 仅对通过 lua_pushinteger 生成的值返回 true,调用 lua_tostring 后不再是整数。

  • 用户数据和轻量级用户数据有不同的类型 ID,但共享同一类型名称 'userdata'。

  • lua_islightuserdata 是 lua_isuserdata 的子集,只有轻量级用户数据返回 true。

  • 轻量级用户数据没有每个值的元表,所有轻量级用户数据共享一个默认未设置的元表。

延伸问答

Lua 中整数和数字有什么关系?

在 Lua 中,整数不是单独的类型,而是数字的一种。所有通过 lua_pushinteger 生成的值都被视为数字。

如何将数字转换为字符串?

可以使用 lua_tostring 函数将数字转换为字符串,调用后类型会变为字符串,但仍然被视为数字。

lua_isinteger 函数的作用是什么?

lua_isinteger 仅对通过 lua_pushinteger 生成的值返回 true,调用 lua_tostring 后不再是整数。

轻量级用户数据和用户数据有什么区别?

轻量级用户数据和用户数据有不同的类型 ID,但共享同一类型名称 'userdata',且轻量级用户数据没有每个值的元表。

lua_islightuserdata 和 lua_isuserdata 的区别是什么?

lua_islightuserdata 是 lua_isuserdata 的子集,只有轻量级用户数据返回 true,而 lua_isuserdata 对所有用户数据和轻量级用户数据都返回 true。

轻量级用户数据的元表是什么?

轻量级用户数据没有每个值的元表,所有轻量级用户数据共享一个默认未设置的元表。

🏷️

标签

➡️

继续阅读