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


helloworld.lua

#!/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”)   // 压入一个字符串

posted on 2021-07-24 10:50  lodger47  阅读(39)  评论(0)    收藏  举报

导航