Lua.LearningLua.7-userdata
Learning Lua: 7 - userdata
1. Userdata basic
"There are eight basic types in Lua: nil, boolean, number, string, userdata, function, thread, and table.
The type() function gives the type name of any given value. " Ref[1]
"The userdata type allows arbitrary C data to be stored in Lua variables. It has no predefined operations in Lua, except
assignment and equality test. Userdata are used to represent new types created by an application program or alibrary
written in C " Ref[1] - 2.7 Userdata and Threads p18
"Lua compares tables and userdata by reference, that is, two such values are considered equal only if they are the very
same object. " Ref[1] - 3.2 Relational Operations p22
2. Userdata and Metatable
"Tables and userdata have individual metatables; values of other types share one single metatable for all values of
that type. " Ref[1] - 13 Metatables and Metamethods p127
"The usual method to distinguish one type of userdata from other userdata is to create a unique metatable for that type.
Everytime we create a userdata, we mark it with the corresponding metatable; everytime we get a userdata, we check
whether it has the right metatable. " Ref[1] - 29.2 Metatables p296
3. Lua C API for userdata
Lua C API 中提供的针对userdata的接口有:
C API | 接口说明 |
lua_isuserdata |
int lua_isuserdata (lua_State *L, int index); Returns 1 if the value at the given acceptable index is a userdata (either full or light), and 0 otherwise. LUA_API void *lua_touserdata (lua_State *L, int idx) { |
lua_touserdata |
void *lua_touserdata (lua_State *L, int index); If the value at the given acceptable index is a full userdata, returns its block address. If the value is a light userdata, returns its pointer. Otherwise, returns |
lua_pushlightuserdata |
void lua_pushlightuserdata (lua_State *L, void *p); Pushes a light userdata onto the stack. Userdata represent C values in Lua. A light userdata represents a pointer. It is a value (like a number): you do not create it, it has no individual metatable, and it is not collected (as it was never created). A light userdata is equal to "any" light userdata with the same C address. |
lua_newuserdata |
void *lua_newuserdata (lua_State *L, size_t size); This function allocates a new block of memory with the given size, pushes onto the stack a new full userdata with the block address, and returns this address. Userdata represent C values in Lua. A full userdata represents a block of memory. It is an object (like a table): you must create it, it can have its own metatable, and you can detect when it is being collected. A full userdata is only equal to itself (under raw equality). When Lua collects a full userdata with a is collected again then Lua frees its corresponding memory. |
luaL_checkudata |
void *luaL_checkudata (lua_State *L, int narg, const char *tname); Checks whether the function argument |
4. full userdata and light userdata
"A light userdatum is a value that represents a C pointer (that is, a value). A light userdata is a value, not an object;
we do not create them " Ref[1] 29.5 Light Userdata p301
"Light userdata are not buffers, but single pointers. They have no metatables. Like numbers, light userdata are not
managed by the garbage collector. " Ref[1] 29.5 Light Userdata p302
"The real use of light userdata comes from equality. As a full userdata is an object, it is only equal to itself.
A light userdata, on the other hand, represents a C pointer value. As such, it is equal to any userdata that represents
the same pointer. Therefore, we can use light userdata to find C objects inside Lua. "
"Another typical scenario is the need to retrieve a full userdata given its C address. "
Ref[1] 29.5 Light Userdata p303
"We can not store a Lua table inside a userdatum(or inside any C structure), but Lua allows each userdata to
have a user value, which can be any Lua table, associated to it." Ref[1] 30.2 An XML Parser p311
other: thread function table
Reference
1. <<Programming in Lua>> 3rd Edition
Lua.LearningLua.7-userdata的更多相关文章
- Lua中的userdata
[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于functio ...
- lua笔记之userdata
1.一直使用框架里封装好的c库,想着自己一点一点的写些例子,学习下,以后需要c库,可以自己写了. 下边是一个简单的userdata的例子--数组操作. newarray.c #include &quo ...
- Lua的Full UserData、Light UserData和metatable
http://lua.2524044.n2.nabble.com/LightUserData-and-metatables-td3807698.html https://www.lua.org/man ...
- Lua.LearningLua.5-document-for-luaL_findtable-function
Learning Lua: 5 - Document for luaL_findtable() function 文档中没有找到luaL_findtable()函数的说明,这里尝试补充. LUALIB ...
- Lua 与 C 交互之UserData(4)
lua作为脚本于要能够使用宿主语言的类型,不管是宿主基本的或者扩展的类型结构,所以Lua提供的UserData来满足扩展的需求.在Lua中使用宿主语言的类型至少要考虑到几个方面: 数据内存 生命周期 ...
- lua 基础 2 类型和值
-- 类型 和 值--[[ 8中类型 滚动类nil.boolean. number.string.userdata.function.thread 和 table.]] print (type(&qu ...
- 《The Evolution of Lua》读书笔记 1
lua的优点: 可移植性 容易嵌入 体积小 高效率 这些优点都来自于lua的设计目标:简洁.从Scheme获得了很多灵感,包括匿名函数,合理的语义域概念 lua前身: 巴西被禁运,引入计算机软件和 ...
- lua中的table、stack和registery
ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正 ...
- C++混合编程之idlcpp教程Lua篇(3)
上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与LuaTutorial0相似,工程LuaTutoria ...
随机推荐
- Win10外包公司——长年承接Win10App外包、Win10通用应用外包
在几天前的WinHEC大会中,微软特意在大会中展示了其对通用应用的称呼规范,现在,适用于Windows通用平台的应用的正式名称为“Windows应用”(Windows apps),简洁明了. 总而言之 ...
- Logstash安装及部署
安装及部署 一.环境配置 操作系统:Cent OS 7 Logstash版本:2.1.1.tar.gz JDK版本:1.7.0_51 SSH Secure Shell版本:XShell 5 二.操作过 ...
- 在VBA中调用winsock控件
如果系统没有Winsock控件的话,可以下载下面的控件MSWINSCK.OCX,然后将该文件复制到C:\Windows\System32目录下. 在VBE窗口中,从菜单"工具"-& ...
- 解决eclipse+git中每次clean项目需要重新commit文件
使用.gitignore文件避免每次clean项目需要重新commit文件(XX.xcodeproj/project.xcworkspace/xcuserdata/XX.xcuserdatad/Use ...
- 使用jquery获取url以及jquery获取url参数的方法
使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下 1.window.location.href; 其实只是用到了javas ...
- C++中的RTTI机制解析
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...
- sql条件中比较性能优化
第一个比第二个性能高. 查询语句意义: 如果codelist中tablecode配置为0时, t.Table_Code = 'SV_RETURN_BILL'不生效. 如果codelist中tablec ...
- JavaScript 对象 之继承对象 学习笔记
假设,我们有个这样的需求: 两个种族,每个种族都有 名字.血量(默认200).行为(行为有 跳跃.移动速度 这些属性)等共有属性. 人族能量值比兽人多10%,兽人血量比人族多10%. 职业有战士和法师 ...
- XidianOJ 1097 焊板子的xry111
题目描述 我们知道xry111不仅仅代码写的棒,硬件也不是一般人可以比拟的,比如他可以左手右手加上嘴里叼着一个烙铁一起工作,同时焊接三块板子!Orz,现在他的实验室知道他这么厉害了,准备让他焊接N块板 ...
- mysql批量执行sql文件
1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source .sql; source .sql; source .sql; source ...