lua学习笔记

一. 环境配置

我的电脑是mac

# 下载
curl -R -O http://www.lua.org/ftp/lua-5.4.6.tar.gz
# 解压
tar zxf lua-5.4.6.tar.gz
# 进入
cd lua-5.4.6
# 编译
make all test
# 测试 print("hello world")
src/lua
# 退出
os.exit()

# 配置环境变量
cd
vim .zshrc
export LUA_HOME=/Users/yhyh/local/lua-5.4.6
export PATH=$LUA_HOME/src:$PATH
source .zshrc
# 测试
which lua

二 基本数据类型

Lua 中有八种基本类型: nil、boolean、number、 string、function、userdata、 thread和table
type (v)返回v变量的类型,编码为字符串

-- number
num = 12
print(type(num))
print(type(3.14))

--string
str = "abc"
print(type(str))
print(type('abc'))
print(type('a'))
print(type("a"))

-- nil
a = nil
print(type(a))
print(type(nil))

-- boolean
flag = true
print(type(flag))
print(type(true))

--function
func1 = function(a, b) return a + b end
print(type(func1))
print(type(print))
print(type(type))

--table
persion = {name = "甘雨", age = 21}
print(type(persion)) 
print(type({})) 

table

persion = {
    id = 01,
    name = "甘雨",
    sex = "女",
}

--增加字段
persion.age = 123
--删除字段
persion.sex = nil
--修改字段
persion.id = 10

for k, v in pairs(persion) do
    print(k,"==>",v);
end

三. 运算符

1.算术运算符

-- 加
print(3 + 4.1) -- 7.1
-- 减
print(3 - 4)
-- 乘
print(3 * 4)
-- 除
print(3 / 4) -- 0.75
-- 取模
print(3 % 4) -- 3

关系运算符

关系运算符的运算结果只能是true 或 false,且只能在相同类型的数据间运算(运算时不会做隐式类型转换)
对于对象型的数据(function,userdata,table),比较运算是比较其引用
-- 等于
print(3 == 4.1)
-- 不等于
print(3 ~= 4)
-- 大于
print(3 > 4)
-- 小于
print(3 < 4)
-- 大于或等于
print(3 >= 4)
-- 小于或等于
print(3 <= 4)

逻辑运算符

  1. 在lua 中,逻辑运算与其它语言的逻辑运算不是同一个意思,其运算结果返回值是参与运算的变量之一(not 除外,not 只返回true 或false)
  2. 在lua中,只有nil和false为假,其它都为真
--如果a为真,则返回b, 如果a为假,则返回a
print(a and b)
--如果a为真,则返回a,如果a为假,则返回b
print(a or d)
--如果e为真,则返回假,如果e为假,则返回真
print(not e)

四 流程控制

判断

-- if
if a == nil then
    print("a==>nil");
end

-- if else
if a == nil then
    print("a == nil");
else
    print("a == nil");
end

-- if elseif else
if score >= 80 then
    print("优秀");
elseif score >= 60 and score < 80 then
    print("及格");
else
    print("不及格");
end

循环

  1. while循环
--while循环 求和 1+2+3+...100    5050
i, sum = 0, 0;
while i <= 100 do
    sum = sum + i;
    i = i + 1;
end
  1. for循环
-- 变量名=初始值,结束值,步长(默认值为1,可省略)
for i = 1, 10, 2 do
    io.write(i, " ");
end

-- ipairs顺序遍历,中间的序号不会断开,遇到第一个nil会直接终止,遇到k->v直接跳过
array = { 11, 22, "jia", 33, nil, 44, 55, 66, key = "vvv", 77 };
for k, v in ipairs(array) do
    print(k, v)
end

--  pairs 遇到nil会跳过,同时适用数组类型和k->v类型的集合,如果是混搭的时候,会优选获取数组类型数据
array = { id = 10, name = "甘雨", age = 21, country = "China", nil, "beautiful", "cute" };
for k, v in pairs(array) do
    print(k, v);
end

String常用api

str = "cba";
-- 转大写
print(string.upper("design"))
-- 转小写
print(string.lower("Design"))
-- 字符串长度
print(string.len("hello world"))
print(string.len("你好 世界"))
-- 反转
print(string.reverse("hello world"))
local num = 111
-- 连接符,number字面量如果在连接符左边,后面要有空格
print("abc" .. str .. num .. 110 .. "jiewei");
-- 截取,后面参数是开始位置和结束位置,结束位置可省略不写
print(string.sub("abcdefg", 3, 5))
-- 负数是从右往左数
print(string.sub("abcdefg", -4, -3))
-- 在字符串s中 查找pattern(可以是表达式),如果找到,则返回pattern第一次出现的开始位置和结束位置,如果没找到,返回nil
-- string.find(s, pattern, init, plain)
str = "abcd1234"
print(string.find(str, "d1"))
--从指定位置处开始查找
print(string.find(str, "d1", 3))
--如果是负数,则是从字符串长度+该负数的位置开始找
print(string.find(str, "d1", -6))

元表和元方法

-- 说明: setmetatable(table, metatable) 可将 metatable 设为 table 的元表
t1 = { 11, 22, nil, nil, 99909,9}
t2 = { 111, 222, 333, 444, 555 }
metaT3 = {};
-- 将 metaT3 设为 t1 的元表
setmetatable(t1, metaT3)
-- 将 metaT3 设为 t2 的元表
setmetatable(t2, metaT3)
-- 重写元方法__add ( + )
metaT3.__add = function(t1, t2)
    local ans = {}
    for i = 1, #t1 > #t2 and #t1 or #t2  do
        ans[i] = (t1[i] or 0) + (t2[i] or 0);
    end
    return ans
end
-- 测试效果
for k, v in ipairs(t1 + t2) do
    print(k, v);
end

面向对象

self

t1 = {
    name = "甘雨",
    age = 21
}

-- 只能写在外面
function t1:getAge()
    return self.age
end

-- 测试效果
print(t1:getAge())

自索引

t1 = { name = "甘雨" };

meta = {
    age = 21,
}

-- 自己索引自己了,这种就叫自索引
meta.__index = meta

setmetatable(t1, meta)

-- 测试效果
print(t1.phone)

自索引实现继承

father = { age = 38};
function father:printFatherAge()
    print("爸爸的年龄是"..self.age)
end

--加自索引
father.__index = father;

son = { age = 15 };
function son:printSonAge()
    print("儿子的年龄是"..self.age)
end

setmetatable(son, father)

-- 测试效果
son:printSonAge()
son:printFatherAge()

类的实例化

User = {name = "甘雨", age = 21 }
User.__index = User

function User:new(obj)
    obj = obj or {}
    setmetatable(obj, self)
    return obj
end

function User:setAge(val)
    self.age = val
end

u1 = User:new({name = "钟离"})

-- 测试效果
print(u1.name)
u1:setAge(100)
print(u1.age)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值