lua开始(一)
安装
hello world
基本数据类型
Lua调用C/C++代码
安装
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
make xxxx test错误

- 错误原因就是缺少依赖包libreadline-dev
Hello world
#!/bin/lua
print("Hello World!")
执行 lua helloworld.lua
注释
单行注释
--
多行注释
--[[
--
--]]
在默认情况下,变量总是认为是全局的。
> print(b)
nil
> b=10
> print(b)
10
>
基本数据类型
-
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
-
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
-
table
#!/bin/lua
tab1 = {key1="val1",key2="val2","val3"}
for k,v in pairs(tab1) do
print(k .. " - " .. v)
end
tab1.key1 = nil
for k,v in pairs(tab1)do
print(k .. "-" ..v)
end

#!/bin/lua
a = {}
a["key"]="value"
key=10
a[key]=22
a[key]=a[key]+11
for k,v in pairs(a) do
print(k .. " : "..v)
end
-- 结果
key : value
10 : 33
- number (Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义))
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(1.8263692594256e-06))
#!/bin/lua
print("2"+6)
print("2"+"6")
print("2+7")
print("-2e2"*"7")
print("2e3"*"7")
print("0.2e3"*"7")
print("error"+1)

- string (字符串,字符串由一对双引号或单引号来表示,也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。)
- 使用 # 来计算字符串的长度,放在字符串前面
html = [[
<html>
<head></head>
<body>
<a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
返回多个值
s, e = string.find("www.runoob.com", "runoob")
print(s, e)
5 10
- boolean(boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true)
#!/bin/lua
print(type(true))
print(type(false))
print(type(nil))
if false or nil then
print("至少又一个是 true")
else
print("false 和 nil 都为false")
end
if 0 then
print("数字 0 是 true")
else
print("数字 0 为 false")
end
- function 在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里
#!/bin/lua
-- 函数也可以这样写myfunc=function()
function factoriali1(n)
if n == 0 then
return 1
else
return n * factoriali1(n - 1)
end
end
print(factoriali1(5))
factoriali2 = factoriali1
print(factoriali2(5))
示例2(function 可以以匿名函数(anonymous function)的方式通过参数传递)
#!/bin/lua
function testFun(tab,fun)
for k,v in pairs(tab) do
print(fun(k,v))
end
end
tab={key="val1",key2="val2"}
testFun(tab,function(key,val)
return key.. "="..val
end
)
示例3
function maximum (a)
local mi = 1 -- 最大值索引
local m = a[mi] -- 最大值
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
print(maximum({8,10,23,12,5}))
-- 23 3
- 函数可变参数
- select('#', …) 返回可变参数的长度。
- select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表
function average(...)
result = 0
local arg={...} --> arg 为一个表,局部变量
for i,v in ipairs(arg) do
result = result + v
end
-- print("总共传入 " .. select("#",...) .. " 个数")
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
- 变量(Lua 变量有三种类型:全局变量、局部变量、表中的域)
#!/bin/lua
a=5
local b =5
function joke()
c = 5
local d=6
end
joke()
print(c,d)
do
local a= 6
b =6
print(a,b)
end
print(a,b)
Lua调用C/C++代码
- 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出.在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶

对栈的操作()
lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
lua_createtable(L, 0, 0) // 新建并压入一个表
lua_pushnumber(L, 343) // 压入一个数字
lua_pushstring(L, “mystr”) // 压入一个字符串
浙公网安备 33010602011771号