前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Lua基础教程1(长文预警)

Lua基础教程1(长文预警)

作者头像
keyle
发布2024-11-01 12:14:15
发布2024-11-01 12:14:15
6700
代码可运行
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作
运行总次数:0
代码可运行

推荐一个快速学习LUA的网站 ,这个网站的内容写的短有些细节忽略了。有时间最好还是要看下面推荐的书 推荐书籍 Programming in Lua third edition.pdf

总结一点学习编程语言的技巧

  1. 学习一个新的语言难免会涉及到大量的内置限定词。这时候就需要使用一个合适的开发工具(重要),智能提示可以帮助我们快速输入和记忆这些重要且不好记忆的文法。
  2. 类比之前的语言 总是可以找到大量的特性的,这时候就免去的重复的记忆

关于lua语言一些难搞的概念

这个可以放到最后看

  1. 迭代器

HelloWorld

我在桌面新建了一个 a.lua 脚本 , 第一行代码是让这个脚本去寻找解释器

代码语言:javascript
代码运行次数:0
复制
#!/usr/local/bin/lua
print("hello world");

因为权限问题 我先给脚本授权,然后直接调用了这个脚本

代码语言:javascript
代码运行次数:0
复制
keyle@keyles-MacBook-Pro  ~/Desktop  chmod a+x /Users/keyle/Desktop/a.lua
keyle@keyles-MacBook-Pro  ~/Desktop  ./a.lua
hello world

保留关键字

代码语言:javascript
代码运行次数:0
复制
and	break	do	else
elseif	end	false	for
function	if	in	local
nil	not	or	repeat
return	then	true	until
while

基础数据类型

nil、boolean、number、string、userdata、function、thread和table

检测类型

最后一个输出结果 type(nil) 之后 得到了一个 string。

代码语言:javascript
代码运行次数:0
复制
print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

nil的特性

使用nil 可以删除table里面的key-value

代码语言:javascript
代码运行次数:0
复制
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end
print("")
tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

key1 - val1已经被删除了。在table里如果默认没有声明 key ,则默认从1开始自增

代码语言:javascript
代码运行次数:0
复制
1 - val3
key1 - val1
key2 - val2

1 - val3
key2 - val2

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真” 在其他语言也是如此

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

string

字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示”一块”字符串。 在lua里使用#来计算字符串长度。

代码语言:javascript
代码运行次数:0
复制
print(#"123")

table

Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。

在 Lua 里表的默认初始索引一般以 1 开始。

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

代码语言:javascript
代码运行次数:0
复制
-- 创建一个空的 table
local tbl1 = {}
 
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

for i,v in ipairs(tbl2) do
	print(i,v)
end

输出结果:

代码语言:javascript
代码运行次数:0
复制
 ⚙  keyle@keyles-MacBook-Pro  ~/Desktop  ./a.lua
1	apple
2	pear
3	orange
4	grape

table计数截断

代码语言:javascript
代码运行次数:0
复制
local tb = {[1] = "1",[2] = "2",[20] = "20"}
print(#tb)    -- 2
print(tb[20]) -- 20

注意看上面dictionary表中索引如果中断,是无法正确获取table长度的。 解决办法:用keyValue paire去做累计计数,获取正确的长度。

table的remove会返回自身

代码语言:javascript
代码运行次数:0
复制
tb1 = {3,3,2,1}
print(table.remove(tb1, 1))--3

function

  • 支持作为变量传递
  • 支持以匿名的方式使用
  • 支持多个返回值

多个返回值

支持多个返回值,比如string.find,其返回匹配串”开始和结束的下标”(如果不存在匹配串返回nil)。 举个例子:返回字符串的开始|结束下表

代码语言:javascript
代码运行次数:0
复制
s, e = string.find("just test for you", "test") 
print(s, e)

--测试函数的多个返回值
func1  =  function()
			return "keyle","666"
		  end
print(func1())
代码语言:javascript
代码运行次数:0
复制
6	9
keyle	666

可变参数

lua支持不固定参数的传入

代码语言:javascript
代码运行次数:0
复制
func1  =  function(...)
			local args = {...}
			local result = 0

			for i=1,#args do
				result = result + args[i]
			end

			return result,#args
		  end

print(func1(1,2,3,4,5))
-- 返回结果 15	5

thread

lua使用的是协程(coroutine) 与 unity3d的机制几乎一样。这个也好理解。

userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。ulua就是通过扩展userdata来实现调用unity3d的各种属性。

变量作用域

Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。 尽可能使用局部变量,因为访问速度快

代码语言:javascript
代码运行次数:0
复制
do 
	local a = 123
	print(a)
end
--超出了作用域 print -> nil
print(a)

赋值

简单形象的赋值方式,第二第三两行是交换两个变量的值。免去写交换算法了

代码语言:javascript
代码运行次数:0
复制
a, b = 10, 2 * x           --> a=10; b=2*x
x, y = y, x                -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]    -- swap 'a[i]' for 'a[j]'

左右两边要对称,如果不对称参看下文

代码语言:javascript
代码运行次数:0
复制
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略

这里直接使用 [table].key 的方式取出了 “321”

代码语言:javascript
代码运行次数:0
复制
a = {3,2,1,9}
a["key"] = "321"

print(a.key)
print(a[1])
print(a[4]) 

print("-----")

for i,v in ipairs(a) do
	print(i,v)
end

控制台输出 :

代码语言:javascript
代码运行次数:0
复制
321
3
9
-----
1	3
2	2
3	1
4	9

循环

其他的方式类似 for while所有一样都一样,下面这个do while循环这里取个例子

代码语言:javascript
代码运行次数:0
复制
repeat
   statements
until( condition )

输出1 – 10

代码语言:javascript
代码运行次数:0
复制
i = 1
while true
do
	if(i>10) then
		break
	end
	print(i)
	i=i+1
end

符号

  1. 不允许类似 a ++ , a/=1 之类的写法
  2. 不允许类似c#里的&&(and)符号,这里需要用 and
  3. 使用 .. 连接字符串 ..
  4. #用来计算字符或者table长度
  5. ~=这是个不等于符
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结一点学习编程语言的技巧
  • 关于lua语言一些难搞的概念
  • HelloWorld
  • 保留关键字
  • 基础数据类型
    • 检测类型
      • nil的特性
    • boolean
    • number
    • string
    • table
    • table计数截断
    • table的remove会返回自身
    • function
      • 多个返回值
      • 可变参数
    • thread
    • userdata
  • 变量作用域
  • 赋值
  • 循环
  • 符号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档