1Lua 中所有的值都是 一等公民。 这意味着所有的值均可保存在变量中、 当作参数传递给其它函数、以及作为返回值。
11 Lua 中有八种基本类型: nil、boolean、number、string、function、userdata、 thread 和 table。 Nil 是值 nil 的类型, 其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。 Boolean 是 false 与 true 两个值的类型。 nil 和 false 都会导致条件判断为假; 而其它任何值都表示为真。 Number 代表了整数和实数(浮点数)。 String 表示一个不可变的字节序列。 Lua 对 8 位是友好的: 字符串可以容纳任意 8 位值, 其中包含零 ('\0') 。 Lua 的字符串与编码无关; 它不关心字符串中具体内容。
number 类型有两种内部表现方式, 整数 和 浮点数。 对于何时使用哪种内部形式,Lua 有明确的规则, 但它也按需作自动转换。 因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你也可以把 Lua 编译成使用 32 位整数和单精度(32 位)浮点数。 以 32 位表示数字对小型机器以及嵌入式系统特别合适。
2Lua 可以调用(以及 *** 作)用 Lua 或 C 编写的函数。 这两种函数有统一类型 function。
userdata 类型允许将 C 中的数据保存在 Lua 变量中。 用户数据类型的值是一个内存块, 有两种用户数据: 完全用户数据 ,指一块由 Lua 管理的内存对应的对象; 轻量用户数据 ,则指一个简单的 C 指针。 用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的 *** 作。 通过使用 元表 ,程序员可以给完全用户数据定义一系列的 *** 作 你只能通过 C API 而无法在 Lua 代码中创建或者修改用户数据的值, 这保证了数据仅被宿主程序所控制。
thread 类型表示了一个独立的执行序列,被用于实现协程 Lua 的线程与 *** 作系统的线程毫无关系。 Lua 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。
3table 是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。) 表可以是 异构 的; 也就是说,表内可以包含任何类型的值( nil 除外)。 任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值 nil 。
4表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 aname 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表)。
我们使用 序列 这个术语来表示一个用 {1n} 的正整数集做索引的表。 这里的非负整数 n 被称为该序列的长度。
和索引一样,表中每个域的值也可以是任何类型。 需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。 这样,表就可以携带 方法 了。
索引一张表的原则遵循语言中的直接比较规则。 当且仅当 i 与 j直接比较相等时 (即不通过元方法的比较), 表达式 a[i] 与 a[j] 表示了表中相同的元素。 特别指出:一个可以完全表示为整数的浮点数和对应的整数相等 (例如:10 == 1)。 为了消除歧义,当一个可以完全表示为整数的浮点数作为键值时, 都会被转换为对应的整数储存。 例如,当你写 a[20] = true 时, 实际被插入表中的键是整数 2 。 (另一方面,2 与 "2" 是两个不同的 Lua 值, 故而它们可以是同一张表中的不同项。)
表、函数、线程、以及完全用户数据在 Lua 中被称为 对象: 变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的 *** 作, 这些 *** 作均不会做任何形式的隐式拷贝。
库函数 type 用于以字符串形式返回给定值的类型
当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 相同类型的栈来交互。C 函数从栈中获取她的参数,调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值,每个 C 函数还会返回结果的个数(the function returns (in C) the number of results it is leaving on the stack)。
// luacallcppcpp : 定义控制台应用程序的入口点。
//
#include "stdafxh"
#include <stdioh>
//lua头文件
#ifdef __cplusplus
extern "C" {
#include "luah"
#include <lauxlibh>
#include <lualibh>
}
#else
#include <luah>
#include <lualibh>
#include <lauxlibh>
#endif
int static add(lua_State L)
{
//获取第一个参数
double x=lua_tonumber(L,1);
double y=lua_tonumber(L,2);
//返回值压栈,压入两个返回值
lua_pushnumber(L,x+y);
lua_pushnumber(L,1000);
//返回值的个数,
return 2;
}
int _tmain(int argc, _TCHAR argv[])
{
lua_State L=NULL;
/ 初始化 Lua /
L = lua_open();
/ 载入Lua基本库 /
luaL_openlibs(L);
/ 运行脚本 /
luaL_dofile(L, "/script/funclua");
//函数入栈
lua_pushcfunction(L,add);
//设置全局函数名
lua_setglobal(L,"Add");
//调用lua函数LUACALLCPP来反调cpp中的add
lua_getglobal(L,"LUACALLCPP");
lua_pushnumber(L,10);
lua_pushnumber(L,3433);
//两个参数,两个返回值
lua_pcall(L,2,2,0);
//取返回值二
printf("lua call cpp return val is %f \n",lua_tonumber(L,-1));
//取返回值一
printf("lua call cpp return val is %f \n",lua_tonumber(L,-2));
/ 清除Lua /
lua_close(L);
return 0;
}
---------------------------------------
--region lua
--Date
--此文件由[BabeLua]插件自动生成
print("funclua hava been loaded")
function LUACALLCPP(x,y)
-- 调用c++中的函数
return Add(x,y)
--print(Add(x,y))
end
--endregion
运行结果:
因为 lua 解释器就是用 C 语言开发的,而目前 C 语言在协议上与 C++ 是相同的(或者说使用同一套C协议,虽然C++由C衍生,但对于编译器而言反而更像是从C++删减成C,所以C与C++兼容)
其实不必自己解释lua相关的代码
因为c里面本来就有一套很完整的交互机制
这也是我们平时lua运行时的基础
你可以查一下相关的api
先引用lua相关的头文件
在创建了lua的栈后(luaL_newstate)
打开基本的库(luaL_openlibs)
加载lua文件(luaL_loadfile)
执行文件(lua_pcall)
获取文件中的lua函数(lua_getglobal)
执行函数(lua_pcall)
以上就是关于计算机软件开发扩展语言lua中值与类型的解释是什么全部的内容,包括:计算机软件开发扩展语言lua中值与类型的解释是什么、LUA怎么获取指定的函数返回值、lua 与 c++或者c 交互的底层原理谁能解释一下最最底层的,为什么它们调用C或者C++的函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)