LUA語言中
字符串的組拼是使用两个点
LUA語言中
字符串的組拼是使用两个点
luaSciTE学习笔记
c# null = lua nil
c# bool = lua boolean
c# float = lua number
c# string = lua string
c# void = lua function
c# var = lua userdate
c# thread = lua thread
c# [] = lua table
type() 获取值类型
tab1={} --空表
tab2={key1=100,key2="value"} --有键对应值的表
tab3={"apple","pear","orange","grape"} --无键对应的表
for key val pairs(tab1) do
print(key ..":"..val)
end
表的使用方式
调用
tab1.key1="ANYU"
tab1["key1"]="anyu"
print(tab1.key1)
print[tab1["key1"]]
1、lua中索引从1开始
05.print方法、单行和多行注释
1.print(“hello”)后面的“;”可加可不加。
2.print用来向控制台输出字符。
3.单行注释:--
eg:--print用来向控制台输出字符
4.多行注释:--[[
--]]
eg:--[[
print(“hello”)
print(“hello world”)
--]]
5.多行注释快速编程单行注释,在“--[[ --]]”前加一个--[[ --]]---[[ --]]
boolean类型
boolean nil也当做是false
Lua 把 false和nil 当做假 其他都是真 例如数字10
if else 没有括号
例:
1.if true then
print(true)
end
2.
if nil then
print()
else
print()
end
table.sort 排序
table.maxn 最大值
分段传参,利用主线程和协程合作,
function foo (a)
print("foo 函数输出", a)
return coroutine.yield(2 * a) -- 返回 2*a 的值
end
co = coroutine.create(function (a , b)
print("第一次协同程序执行输出", a, b) -- co-body 1 10
local r = foo(a + 1)
print("第二次协同程序执行输出", r)
local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入
print("第三次协同程序执行输出", r, s)
return b, "结束协同程序" -- b的值为第二次调用协同程序时传入
end)
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")
yield参数作为 resume的返回值
resume的参数作为协程的参数
我使用的lua 5.4版本 arg 的值
myfirst.lua:125
-3 c:/Users/Administrator/.vscode/extensions/actboy168.lua-debug-1.36.0/runtime/win64/lua54/lua.exe
myfirst.lua:125
-2 -e
myfirst.lua:125
-1 dofile[[c:/Users/Administrator/.vscode/extensions/actboy168.lua-debug-1.36.0/script/launch.lua]];DBG{10340,[[ansi]]}
tabl中的索引从1开始
简单的输出语句:
print('hello wrold')
结尾分号可加可不加
注释:
1.-- 单行注释
2.--[[ 多行注释]]--
可变函数中默认的arg数组最后一位是数组长度
lua5.3中取消了默认arg,需要在函数体内自行定义
repeat 循环体
until(条件)
满足条件后跳出循环
局部变量的生命周期与所咋语句块有关
局部变量可以和全局变量重名
如果出现重名的,优先访问距离最近的
只要变量前面不加local关键字,就是全局变量
数据类型
需要先保存好文件才能运行文件。
Lua的一些基础常识
1.nil 空,和C#的null类似但又不同
对于全局变量和table,nil还有删除的作用,给全局变量或table表里的变量赋一个nil值,等同于把他们删掉(同时释放了内存)
nil作比较时要加上引号“”
2.Lua默认只有number一种数字类型
3.string字符串一旦赋值,就不能被修改,可以通过string.gsub()方法来修改,可以写成单引号,但是建议用双引号
当两个全是数字的字符串相加,或一个是数字一个是数字字符串时,字符串会进行类型转换,直接相加
"2" + 1 = "3" "3" + "2" = "5"
如果想连接字符串,就使用 .. 符号代替:“a”..“b”="ab"
#号可以计算字符串长度:(#“www.baidu.com”)= 13
4.常见基本语法
~= 相当于C#中的 !=
and,or,not 对应&&,||,!
局部变量,使用local修饰声明,内存在栈上,在一个函数,代码块{}内,代码块结束,内存自动释放
全局变量在堆上 ,可以随时创建,程序结束,内存自动释放
C#:public void test(){}'; Lua: function test() end
lua没有大括号{},控制语句都是 then ... end
lua没有switch结构 print()会默认换行
只有nil是false,0和1都是true
4.table(表)
table可以有数组形式,字典形式,数组字典同时混合形式
5.元表
元表可以扩展普通表的行为,普通表无法直接加减运算等,但可以用元表扩展各类功能
当使用getmetatable方法获取普通表的元表时,如果元表中含有(双下划线)__metatable键值,操作会失败,只能获取到对应的值,不能获取其他东西,用此方法可以保护已经写好的元表扩展不能被其他人获取
__index,元表的扩展方法,当访问到一个不存在的索引的时候,调用这个方法,这个方法默认返回nil
可以直接给__index 赋值一个其他的表,系统会自动寻找这个表有没有对应的值,如果有就返回,没有还是默认的nil
也可以给__index赋值一个方法,用来进行其他操作,比如直接返回设置好的变量之类的
__newindex:当我们对表的数据进行修改的时候,当我们修改的是一个新的索引的时候,也就是之前没有的索引的时候,自动调用
当修改的是一个已经存在的数据的话,不会起作用
(当我们给表添加新的键值对的时候,会调用此方法)
当__newindex 后面是函数的话,会调用此函数,如果后面跟了一个其他的表,那么会将此键值对赋值给那个表,原来的表没有变化
__add:当对两个表进行相加操作时,会起作用,并执行方法,具体结果和写的方法有关