Lua脚本语言简明入门教程美洲杯赌球:

2019-05-31 23:19 来源:未知

lua作为很好的嵌入式语言可以非常好的作为c/c 补充,在游戏行业是得到了广泛的应用

这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动。我很好奇得浏览了一下Lua解释器的源码,这可能是我看过最干净的C的源码了。

一直在思考,能不能把他引入商业领域的规则语言呢?将业务规则经常变的部分提炼出来,

我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文章会挫败人的学习热情,我始终觉得好的文章读起来就像拉大便一样,能一口气很流畅地搞完,才会让人爽(这也是我为什么不想写书的原因)。所以,这必然又是一篇“入厕文章”,还是那句话,我希望本文能够让大家利用上下班,上厕所大便的时间学习一个技术。呵呵。

而无须重新编译程序。作为规则引擎的角色进行使用

相信你现在已经在厕所里脱掉裤子露出屁股已经准备好大便了,那就让我们畅快地排泄吧……

使用前当然得安装一下去http://www.lua.org/下载一个 Lua_v5.1.4.23.exe安装,装完之后执行

运行

可以用 lua.exe逐行解释的方式,或者写完脚本用lExecutor.wlua执行

首先,我们需要知道,Lua是类C的,所以,他是大小写字符敏感的。

1)先来个helloworld

下面是Lua的Hello World。注意:Lua脚本的语句的分号是可选的,这个和GO语言很类似。

复制代码 代码如下:

复制代码 代码如下:

> print 'helloWorld'
helloWorld
> print("helloWorld") --注释是这么写的!
helloWorld
> a='hello'
> print(a)
hello

print("Hello World")

2)主要类型

你可以像python一样,在命令行上运行lua命令后进入lua的shell中执行语句。

复制代码 代码如下:

复制代码 代码如下:

> a=1
> b="abc"
> c={}
> d=print
>
> print(type(a))
number
> print(type(b))
string
> print(type(c))
table
> print(type(d))
function
>

chenhao-air:lua chenhao$ lua
Lua 5.2.2  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> print("Hello, World")
Hello, World
>

如上所示,lua主要有四种类型,即数字,字符串,table(其实理解可以理解为javascript的object),以及函数类型,

也可以把脚本存成一个文件,用如下命令行来运行。

当然了,还有最常的bool型了,true以及false,(这里不考虑nil,以及userdata,thread等)

复制代码 代码如下:

函数类型的变量,加上”() “即可以执行,如

>lua  file.lua

复制代码 代码如下:

或是像shell一样运行:

> d(b)
abc

复制代码 代码如下:

3)变量及常量,字符串

chenhao-air:lua chenhao$ cat hello.lua
#!/usr/local/bin/lua
print("Hello, World")
chenhao-air:lua chenhao$ chmod x hello.lua
chenhao-air:test chenhao$ ./hello.lua
Hello, World

复制代码 代码如下:

语法

> a,b,c,d = 1,2,'c',{1}

注释

> print (a,b,c,d)
      2       c       table: 0041BC58

复制代码 代码如下:

> a="single 'quoted' string and double "quoted" string inside"

-- 两个减号是行注释

> b='single 'quoted' string and double "quoted" string inside'

--[[
 这是块注释
 这是块注释
 --]]

> c= [[ multiple line

变量

>> with'single'

Lua的数字只有double型,64bits,你不必担心Lua处理浮点数会慢(除非大于100,000,000,000,000),或是会有精度问题。

>> and "double" quoted strings inside.]]

你可以以如下的方式表示数字,0x开头的16进制和C是很像的。

>

复制代码 代码如下:

> print(a)

num = 1024
num = 3.0
num = 3.1416
num = 314.16e-2
num = 0.31416E1
num = 0xff
num = 0x56

single 'quoted' string and double "quoted" string inside

字符串你可以用单引号,也可以用双引号,还支持C类型的转义,比如: ‘a' (响铃), ‘b' (退格), ‘f' (表单), ‘n' (换行), ‘r' (回车), ‘t' (横向制表), ‘v' (纵向制表), ‘\' (反斜杠), ‘”‘ (双引号), 以及 ‘” (单引号)

> print(b)

下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)

single 'quoted' string and double "quoted" string inside

复制代码 代码如下:

> print(c)

a = 'alon123"'
a = "alon123""
a = '97lo104923"'
a = [[alo
123"]]

 multiple line

C语言中的NULL在Lua中是nil,比如你访问一个没有声明过的变量,就是nil,比如下面的v的值就是nil

with'single'

复制代码 代码如下:

and "double" quoted strings inside.

v = UndefinedVariable

 > a=a.."看我给接上"  --字符串用两个..可以进行连接

布尔类型只有nil和false是 false,数字0啊,‘'空字符串('′)都是true!

> print(a)

另外,需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。变量前加local关键字的是局部变量。

single 'quoted' string and double "quoted" string inside看我给接上

复制代码 代码如下:

我们关注一下lua比较特别的地方

theGlobalVar = 50
local theLocalVar = "local variable"

1.声明变量及给变量赋值的时候,可以多变量一起赋值
2.字符串常量可以用双引号及单引号,并且混用的时候无须转义字符,跟php有点类型,还可以用”[[]]”括起来

控制语句

这一点类似于c#里面字符串可以加上@符号,可以保留字符串内的格式

不多说了,直接看代码吧(注意:Lua没有 或是 =这样的操作)

4)逻辑控制语句

while循环

复制代码 代码如下:

复制代码 代码如下:

> a=10 --逻辑控制语句就不费口舌了,反正就这几个词,跟pl/sql有点像

sum = 0
num = 1
while num <= 100 do
美洲杯赌球,    sum = sum num
    num = num 1
end
print("sum =",sum)

> if a==10 then

if-else分支

>> print("我是10")

复制代码 代码如下:

>> elseif a== 11 then

if age == 40 and sex =="Male" then
    print("男人四十一枝花")
elseif age > 60 and sex ~="Female" then
    print("old man without country!")
elseif age < 20 then
    io.write("too young, too naive!n")
else
    local age = io.read()
    print("Your age is "..age)
end

>> print("我是11")

上面的语句不但展示了if-else语句,也展示了

>> else

1)“~=”是不等于,而不是!=
2)io库的分别从stdin和stdout读写的read和write函数
3)字符串的拼接操作符“..”

>> print("我是水户洋平等等")

另外,条件表达式中的与或非为分是:and, or, not关键字。

>> end

for 循环

我是10

从1加到100

5)循环结构

复制代码 代码如下:

复制代码 代码如下:

sum = 0
for i = 1, 100 do
    sum = sum i
end

> --第一种while循环
> a=1
> while a~=10 do
>> io.write(a.."  ")
>> a=a 1
>> end
1  2  3  4  5  6  7  8  9  >
> --第二种repeat、until循环
> a=0
> repeat
>>      a=a 1
>>      print(a)
>> until a==5
1
2
3
4
5
> --第三种for循环
> for a=1,4 do
>>      io.write(a)
>> end
1234>
> --比较特别,有个步进的概念,如下是以2为步进
13> for a=1,4,2 do
>> io.write(a..' ')
>> end
1 3 > for a=1,5,2 do
>> io.write(a.. '  ')
>> end
1  3  5  >

从1到100的奇数和

6)函数及其使用

复制代码 代码如下:

复制代码 代码如下:

sum = 0
for i = 1, 100, 2 do
    sum = sum i
end

> --1.先来个最简单的

从100到1的偶数和

> function myFunc1()

复制代码 代码如下:

>>      print("hello function")

sum = 0
for i = 100, 1, -2 do
    sum = sum i
end

>> end

until循环

> myFunc1()

复制代码 代码如下:

hello function

sum = 2
repeat
   sum = sum ^ 2 --幂操作
   print(sum)
until sum >1000

> --2.再来个带参数的

函数

> a=1

Lua的函数和Javascript的很像

> b=2

递归

> function myFunc2(par1,par2)

复制代码 代码如下:

>>      return par1 par2

function fib(n)
  if n < 2 then return 1 end
  return fib(n - 2) fib(n - 1)
end

>> end

闭包

> c=myFunc2(a,b)

同样,Javascript附体!

> print(c)

示例一

> --3.甚至可以返回多个变量

复制代码 代码如下:

> a=1

function newCounter()
    local i = 0
    return function()     -- anonymous function
       i = i 1
        return i
    end
end
 
c1 = newCounter()
print(c1())  --> 1
print(c1())  --> 2

> b=2

示例二

> function myFunc3(A,B)

复制代码 代码如下:

>>      return B,A

function myPower(x)
    return function(y) return y^x end
end
 
power2 = myPower(2)
power3 = myPower(3)
 
print(power2(4)) --4的2次方
print(power3(5)) --5的3次方

>> end

函数的返回值

> c = myFunc3(a,b) --c会等于返回的第一个,在此倒转过来即为2

和Go语言一样,可以一条语句上赋多个值,如:

> print(c)

复制代码 代码如下:

> c,d=myFunc3(a,b) --当然如果给多个变量赋值就没有问题了

name, age, bGay = "haoel", 37, false, "haoel@hotmail.com"

> print(c,d)
      1

上面的代码中,因为只有3个变量,所以第四个值被丢弃。

> print(myFunc3(a,b)) --直接打印就把所有打印出来
      1

函数也可以返回多个值:

> --4.还可以是变参

复制代码 代码如下:

> function myFunc4()

function getUserInfo(id)
    print(id)
    return "haoel", 37, "haoel@hotmail.com", "http://jb51.net"
end
 
name, age, email, website, bGay = getUserInfo()

>> print()

注意:上面的示例中,因为没有传id,所以函数中的id输出为nil,因为没有返回bGay,所以bGay也是nil。

>> end

局部函数

> myFunc4(a,b,c,d)
      2       2       1

函数前面加上local就是局部函数,其实,Lua中的函数和Javascript中的一个德行。

7)table(我觉得理解object也可以)的使用

比如:下面的两个函数是一样的:

复制代码 代码如下:

复制代码 代码如下:

> linbc={}

function foo(x) return x^2 end
foo = function(x) return x^2 end

> linbc.sex = "男"

Table

> linbc.age = 27

所谓Table其实就是一个Key Value的数据结构,它很像Javascript中的Object,或是PHP中的数组,在别的语言里叫Dict或Map,Table长成这个样子:

> print(linbc,linbc.sex,linbc["age"])

复制代码 代码如下:

table: 0041ED50 男      27

haoel = {name="ChenHao", age=37, handsome=True}

TAG标签:
版权声明:本文由美洲杯赌球发布于计算机教程,转载请注明出处:Lua脚本语言简明入门教程美洲杯赌球: