Lua manual翻译——第三章第五、六节
因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况;因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇迁移的文章。
3.5 - 从堆栈中取值
把堆栈中的值转换为指定的C类型,有如下函数可用:
int lua_toboolean (lua_State *L, int index);
lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
size_t lua_strlen (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);
lua_State *lua_tothread (lua_State *L, int index);
void *lua_topointer (lua_State *L, int index);
这些函数可通过任意可接受索引调用,如果用无效索引为参数,则和给定值并不匹配类型一样。
lua_toboolean转换指定索引lua值为C“布尔型”值(0或1)。当lua值仅为false或nil时返回0(如果你仅想接受一个真正的布尔值,可以先使用lua_isboolean去测试这个值的类型。
lua_tonumber转换指定索引的值为数字(lua_Number默认为double)。这一lua值必须数字或可转换为数字的字符串(参考2.2.1),否则lua_tonumber返回0。
lua_tostring将指定索引的值转换为字符串(const char*)。lua值必须为字符串或数字,否则返回NULL。当值为数字,lua_tostring将会把堆栈的原值转换为字符串(当lua_tostring应用到键值上时会使lua_next出现难以找出原因的错误)。lua_tostring返回一个完全对齐的字符串指针,这一字符串总是’/0’结尾(和C一样),但可能含有其它的0。如果你不知道一个字符串有多少个0,你可以使用lua_strlen取得真实长度。因为lua有垃圾收集机制,因此不保证返回的字符串指针在对应的值从堆栈中删除后仍然有效。如果你以后还要用到当前函数返回的字符串,你应当备份它或者将它放到registry中(参考3.18)。
lua_tofunction将堆栈中的值转换为C函数指针,这个值必须为C函数指针,否则返回NULL。数据类型lua_CFunction将在3.16节讲述。
lua_tothread转换堆栈中的值为lua线程(以lua_State*为表现形式),此值必须是一个线程,否则返回NULL。
lua_topointer转换堆栈中的值为通用C指针(void*)。这个值必须为userdata、表、线程或函数,否则返回NULL。lua保证同一类型的不同对象返回不同指针。没有直接方法将指针转换为原值,这一函数通常用以获取调试信息。
lua_touserdata在3.8节讲述。
3.6 - 向堆栈压值
下列API能将C值压入堆栈
void lua_pushboolean (lua_State *L, int b);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushlstring (lua_State *L, const char *s, size_t len);
void lua_pushstring (lua_State *L, const char *s);
void lua_pushnil (lua_State *L);
void lua_pushcfunction (lua_State *L, lua_CFunction f);
void lua_pushlightuserdata (lua_State *L, void *p);
这些函数接受一个C值,并将其转换为对应的lua值,然后将其压入堆栈。lua_pushlstring和lua_pushstring对给定的字符串生成一个可以互转的拷贝,这是个例外。lua_pushstring能压C字符串(即以0结尾并且内部没有0),否则建议使用更通用的lua_pushlstring,它能指定长度。
你同样可以压入“格式化”字符串:
const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);
这两个函数向堆栈压入格式化字符串并返回指向字符串的指针。它们跟sprintf和vsprintf很象但有如下的重要不同:
·你不用申请内存去保存格式化结果,这结果是一个lua字符串并且lua自己会小心管理内存(并通过垃圾收集机制释放)。
·使用转义字符受限。它们没有标志量、宽度和精确度。转义字符能够是’%%’(插入一个”%”)、’%s’(插入一个以0结尾的字符串)、’%f’(插入一个lua_Number)、’%d’(插入一个int)和’%c’(插入一个用int表示的字符)。
函数
void lua_concat (lua_State *L, int n);
用以联结堆栈上部的n个元素,并将它们出栈,将结果放在栈顶。如果n为1,结果为原来的字符串(因为函数什么也没有做);如果n为0,则结果为一个空字符串。联结这一术语依从lua的语义(参考2.5.4)。
Lua manual翻译——第三章第五、六节相关推荐
- Lua manual翻译——第三章第一、二节
因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...
- Lua manual翻译——第三章第七、八、九节
因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...
- Lua manual翻译——第三章第三、四节
因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...
- (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)
文章目录 一:写命中 (1)写回法(write-back) (2)全写法(write-through) 二:写不命中 (1)写分配法(write-allocate) (2)非写分配法(not-writ ...
- (王道考研计算机网络)第三章数据链路层-第六节2:以太网
指导获取:密码7281 专栏目录首页:[专栏必读]王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记.题目题型总结.注意事项.目录导航和思维导图 王道考研408计算机组成原理万字笔记 ...
- (计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射、直接映射和组相连映射)
文章目录 一:全相联映射 二:直接映射 三:组相连映射 前面说过,Cache中实际保存的是主存中的数据副本,所以这里会涉及一个很重要的问题:Cache和主存是如何映射的?所谓映射是指把主存地址空间映射 ...
- (计算机组成原理)第三章存储系统-第六节1:高速缓冲存储器Cache及其相关基本概念、程序访问的局部性原理和命中率
文章目录 一:Cache的基本原理 二:程序访问的局部性原理 三:主存块 四:命中率和缺失率 由于程序的转移概率不会很低,且数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的.这 ...
- (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法1
注意:本节和计组中的Cache替换算法很相似 (计算机组成原理)第三章存储系统-第六节3:Cache替换算法(FIFO,近期最少使用算法-LRU,LFU) 篇幅限制,下一篇请见 点击跳转 文章目录 一 ...
- (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法2
上接: (王道408考研操作系统)第三章内存管理-第二节2:页面置换算法1 文章目录 一:时钟置换算法(CLOCK) (1)简单时钟置换算法 (2)改进型时钟置换算法 二:页面置换算法总结 一:时钟置 ...
最新文章
- 使用十六进制色值表示UIColor
- BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
- spring AoP学习 -----AoP织入器ProxyFactory剖析
- mysql is needed by_libnuma.so.1()(64bit) is needed by mysql-community-server-5.7.9-1.el6.x86_64
- The Stable Marriage Problem(POJ-3487)
- 什么是php 的精华,在用PHP开发中的精华和技巧总结
- VS2012下基于Glut OpenGL显示一些立体图形示例程序:
- FFmpeg和WebRTC
- php 验证码功能的实现原理,php验证码实现原理
- cssmatic gradient css generator,10 Best CSS Gradient Generators
- 『Delphi』File not found的解决办法
- win10创建html,小米随身WIFI在WIN10下无法创建.htm
- Opencv python之车辆识别项目(附代码)
- Tcplistener服务端与tcpclient客户端使用
- libcef.dll丢失怎么办
- 好玩有趣的 iOS URL Scheme
- CDA Level1知识点总结之数据分析概述与职业操守
- winhex中判断+MBR+DBR+EBR方法
- XTU OJ 1309 唯一的子串
- linux中cmd是什么文件格式,CMD 文件扩展名: 它是什么以及如何打开它?
热门文章
- matlab绘制环形彩色圆盘
- nyoj-19-擅长排列的小明
- 温州市大学生创业园举行优秀成果展暨投融资对接会
- 编程大神都读过的10本经典神书,找到了
- 当数据库中存在某个表的年龄大于vacuum_freeze_table_age,就会执行急切冻结过程
- 【论文笔记】Slimmer: Weight Loss Secrets for Docker Registries
- lbi php,ecshop不能在模板文件.dwt和.lbi中直接添加php代碼的解決方法
- 计算机报名qq登录用户名或密码错误,登录电脑微信显示账号或密码错误怎么办...
- 【技术】天洑数据建模实施案例集锦(2) - 燃料电池热管理快速评估
- html点击按钮文件上传,js点击按钮实现文件上传