乐趣区

关于java:Lua

参考:https://www.w3cschool.cn/lua/…

Lua 装置

装置环境:cento7

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

如果遇到以下谬误:

fatal error: readline/readline.h: No such file or directory

装置 libreadline-dev 依赖包

yum install -y readline-devel

HelloLua

创立一个 helloLua.lua 文件,输出

print("Hello Lua!")

保留后执行

lua helloLua.lua

根本语法

交互式运行

lua -i

正文

单行正文

-- 这是一个单行正文

多行正文

--[[
 多行正文
 多行正文
 --]]

标示符

Lua 标示符用于定义一个变量,函数获取其余用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 结尾后加上 0 个或多个字母,下划线,数字(0 到 9)。

最好不要应用下划线加大写字母的标示符,因为 Lua 的保留字也是这样的。

Lua 不容许应用特殊字符如 @, $, 和 % 来定义标示符。Lua 是一个辨别大小写的编程语言。

关键词

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其余用户自定义标示符:

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while

个别约定,以下划线结尾连贯一串大写字母的名字(比方 _VERSION)被保留用于 Lua 外部全局变量。

全局变量

在默认状况下,变量总是认为是全局的。

全局变量不须要申明,给一个变量赋值后即创立了这个全局变量,拜访一个没有初始化的全局变量也不会出错,只不过失去的后果是:nil。

数据类型

Lua 是动静类型语言,变量不要类型定义, 只须要为变量赋值。值能够存储在变量中,作为参数传递或后果返回。

Lua 中有 8 个根本类型别离为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型 形容
nil 这个最简略,只有值 nil 属于该类,示意一个有效值(在条件表达式中相当于 false)。
boolean 蕴含两个值:false 和 true。
number 示意双精度类型的实浮点数
string 字符串由一对双引号或单引号来示意
function 由 C 或 Lua 编写的函数
userdata 示意任意存储在变量中的 C 数据结构
thread 示意执行的独立线程,用于执行协同程序
table Lua 中的表(table)其实是一个 ” 关联数组 ”(associative arrays),数组的索引能够是数字或者是字符串。在 Lua 里,table 的创立是通过 ” 结构表达式 ” 来实现,最简略结构表达式是{},用来创立一个空表。

应用 type 函数测试给定变量或者值的类型

Lua 默认只有一种 number 类型 — double(双精度)类型(默认类型能够批改 luaconf.h 里的定义)

字符串

字符串由一对双引号或单引号来示意。

也能够用 2 个方括号 “[[]]” 来示意 ” 一块 ” 字符串。

html = [[
<html>
<head></head>
<body>
    <a href="//www.w3cschool.cn/">w3cschoolW3Cschool 教程 </a>
</body>
</html>
]]
print(html)

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字

lua 应用 .. 来连贯字符串

> print("123" .. 456)
123456

table(表)

在 Lua 里,table 的创立是通过 ” 结构表达式 ” 来实现,最简略结构表达式是{},用来创立一个空表。也能够在表里增加一些数据,间接初始化表:

-- 创立一个空的 table
local tbl1 = {}
-- 间接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

获取数据

> tbl2 = {"a","b","c"}
> print(tbl2)
table: 0x1e63070
> print(tbl2[1])
a
---------------
> a = {}
> a["aKey"] = "aVlue"
> print(a["aKey"])
aVlue
> for k,v in pairs(a) do
>> print(k .. ":" .. v)
>> end
aKey : aVlue

不同于其余语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引个别以 1 开始。

function(函数)

编辑一个 luaFunction.lua 文件,输出以下内容

function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

执行

lua luaFunction.lua
120
120

function 能够以匿名函数(anonymous function)的形式通过参数传递

-- function_test2.lua 脚本文件
function anonymous(tab, fun)
    for k, v in pairs(tab) do
        print(fun(k, v))
    end
end
tab = {key1 = "val1", key2 = "val2"}
-- 将匿名函数当成参数传入
anonymous(tab, function(key, val)
    return key .. "=" .. val
end)

执行后果

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread(线程)

在 Lua 里,最次要的线程是协同程序(coroutine)。它跟线程(thread)差不多,领有本人独立的栈、局部变量和指令指针,能够跟其余协同程序共享全局变量和其余大部分货色。

线程跟协程的区别:线程能够同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata(自定义类型)

userdata 是一种用户自定义数据,用于示意一种由应用程序或 C/C++ 语言库所创立的类型,能够将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

变量

变量在应用前,必须在代码中进行申明,即创立该变量。编译程序执行代码之前编译器须要晓得如何给语句变量开拓存储区,用于存储变量的值。

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

函数外的变量默认为全局变量,除非用 local 显示申明。函数内变量与函数的参数默认为局部变量。

局部变量的作用域为从申明地位开始到所在语句块完结(或者是直到下一个同名局部变量的申明)。

变量的默认值均为 nil。

循环

Lua 认为 false 和 nil 为假,true 和非 nil 为真。要留神的是 Lua 中 0 为 true

while 循环

while(condition)
do
   statements
end

for 循环

Lua 编程语言中 for 语句有两大类::

  • 数值 for 循环
  • 泛型 for 循环

数值 for 循环

for var=exp1,exp2,exp3 do  
    < 执行体 >  
end  

var 从 exp1 变动到 exp2,每次变动以 exp3 为步长递增 var,并执行一次 ” 执行体 ”。exp3 是可选的,如果不指定,默认为 1。

for i=10,1,-1 do
    print(i)
end

for 的三个表达式在循环开始前一次性求值,当前不再进行求值。

泛型 for 循环

泛型 for 循环通过一个迭代器函数来遍历所有值,相似 java 中的 foreach 语句

-- 打印数组 a 的所有值  
for i,v in ipairs(a) 
    do print(v) 
end  

i 是数组索引值,v 是对应索引的数组元素值。ipairs 是 Lua 提供的一个迭代器函数,用来迭代数组。

Lua repeat…until 循环

Lua 编程语言中 repeat…until 循环语句不同于 for 和 while 循环,for 和 while 循环 d 的条件语句在以后循环执行开始时判断,而 repeat…until 循环的条件语句在以后循环完结后判断。

repeat
   statements
until(condition)

repeat…until 是条件后行, 所以 repeat…until 的循环体外面至多要运行一次。

函数

Lua 编程语言函数定义格局如下:

optional_function_scope function function_name(argument1, argument2, argument3..., argumentn)
   function_body
 return result_params_comma_separated
end
  • optional_function_scope
    该参数是可选的制订函数是全局函数还是部分函数,未设置该参数开端为全局函数,如果你须要设置函数为部分函数须要应用关键字 local
  • function_name:
    指定函数名称。
  • argument1, argument2, argument3…, argumentn:
    函数参数,多个参数以逗号隔开,函数也能够不带参数。
  • function_body:
    函数体,函数中须要执行的代码语句块。
  • result_params_comma_separated:
    函数返回值,Lua 语言函数能够返回多个值,每个值以逗号隔开。

Lua 函数能够返回多个后果,其返回匹配串 ” 开始和完结的下标 ”(如果不存在匹配串返回 nil)

可变参数

Lua 函数能够承受可变数目标参数,和 C 语言相似在函数参数列表中应用三点(…) 示意函数有可变的参数。

Lua 将函数的参数放在一个叫 arg 的表中,#arg 示意传入参数的个数。

function average(...)
   result = 0
   local arg={...}
   for i,v in ipairs(arg) do
      result = result + v
   end
   print("总共传入" .. #arg .. "个数")
   return result/#arg
end

print("平均值为",average(10,5,3,4,5,6))

执行后果:

总共传入 6 个数
平均值为 5.5

运算符

Lua 提供了以下几种运算符类型:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 其余运算符

算术运算符

下表列出了 Lua 语言中的罕用算术运算符,设定 A 的值为 10,B 的值为 20:

操作符 形容 实例
+ 加法 A + B 输入后果 30
减法 A – B 输入后果 -10
* 乘法 A * B 输入后果 200
/ 除法 B / A w 输入后果 2
% 取余 B % A 输入后果 0
^ 乘幂 A^2 输入后果 100
负号 -A 输入后果 v -10

关系运算符

下表列出了 Lua 语言中的罕用关系运算符,设定 A 的值为 10,B 的值为 20:

操作符 形容 实例
== 等于,检测两个值是否相等,相等返回 true,否则返回 false (A == B) 为 false。
~= 不等于,检测两个值是否相等,相等返回 false,否则返回 true< (A ~= B) 为 true。
> 大于,如果右边的值大于左边的值,返回 true,否则返回 false (A > B) 为 false。
< 小于,如果右边的值大于左边的值,返回 false,否则返回 true (A < B) 为 true。
>= 大于等于,如果右边的值大于等于左边的值,返回 true,否则返回 false (A >= B) is not true.
<= 小于等于,如果右边的值小于等于左边的值,返回 true,否则返回 false (A <= B) is true.

逻辑运算符

下表列出了 Lua 语言中的罕用逻辑运算符,设定 A 的值为 true,B 的值为 false:

操作符 形容 实例
and 逻辑与操作符。如果两边的操作都为 true 则条件为 true。 (A and B) 为 false。
or 逻辑或操作符。如果两边的操作任一一个为 true 则条件为 true。 (A or B) 为 true。
not 逻辑非操作符。与逻辑运算后果相同,如果条件为 true,逻辑非为 false。 not(A and B) 为 true。

其余运算符

下表列出了 Lua 语言中的连贯运算符与计算表或字符串长度的运算符:

操作符 形容 实例
.. 连贯两个字符串 a..b,其中 a 为 “Hello ”,b 为 “World”, 输入后果为 “Hello World”。
# 一元运算符,返回字符串或表的长度。 #”Hello” 返回 5

字符串

Lua 语言中字符串能够应用以下三种形式来示意:

  • 单引号间的一串字符。
  • 双引号间的一串字符。
  • [[和]]间的一串字符。

转义字符

转义字符 意义 ASCII 码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS),将以后地位移到前一列 008
\f 换页(FF),将以后地位移到下页结尾 012
\n 换行(LF),将以后地位移到下一行结尾 010
\r 回车(CR),将以后地位移到本行结尾 013
\t 程度制表(HT)(跳到下一个 TAB 地位) 009
\v 垂直制表(VT) 011
\ 代表一个反斜线字符 ”\’ 092
\’ 代表一个单引号(撇号)字符 039
\” 代表一个双引号字符 034
空字符(NULL) 000
\ddd 1 到 3 位八进制数所代表的任意字符 三位八进制
\xhh 1 到 2 位十六进制所代表的任意字符 二位十六进制

字符串操作

序号 办法 & 用处
1 string.upper(argument): 字符串全副转为大写字母。
2 string.lower(argument): 字符串全副转为小写字母。
3 string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString 为要替换的字符串,findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(能够疏忽,则全副替换),如:> string.gsub("aaaa","a","z",3); zzza 3
4 string.find (str, substr, [init, [end]]) 在一个指定的指标字符串中搜寻指定的内容(第三个参数为索引), 返回其具体位置。不存在则返回 nil。> string.find("Hello Lua user", "Lua", 1) 7 9
5 string.reverse(arg) 字符串反转> string.reverse("Lua") auL
6 string.format(…) 返回一个相似 printf 的格式化字符串> string.format("the value is:%d",4) the value is:4
7 string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连贯,byte 转换字符为整数值(能够指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd string.byte("ABCD",4) 68 string.byte("ABCD") 65
8 string.len(arg) 计算字符串长度。string.len("abc") 3
9 string.rep(string, n)) 返回字符串 string 的 n 个拷贝> string.rep("abcd",2) abcdabcd
10 .. 链接两个字符串> print("www.w3cschool"..".cn") www.w3cschool.cn
退出移动版