• Lua学习笔记(二):基本语法


    Lua学习指南:http://www.lua.org/manual/

    首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量。

    Lua关键字

    可以查看这个地址:http://www.lua.org/manual/5.1/manual.html#2.1

    关于分号

    语句的最后可以用分号";"表示结束,也可以不写。

    而对于一行有多个语句的情况下,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,建议总是用分号隔开。

    使用注释

    单行注释使用“--”即可,以后的内容都会被当做注释;

    多行注释以“--[[”开始,以“]]”结束。

    变量

    声明

    由于是动态类型,所以变量声明时不需要声明类型,但是一定要进行赋值,如果希望是空类型,可以赋值nil,如下:

    1 num = 100--数字100
    2 str = "abc"--字符串abc
    3 obj = nil--空类型

    注意在Lua中所有的变量和关键字都是大小写敏感的。

    赋值

    可以一次对多个变量赋值,规则:如果等号(“=”)右边多了,则舍弃,左边多了,则赋值为空(nil) 。

    表达式 a,b=b,a表示a和b的值交换,类型不一样照样可以交换。

    1 a, b, c = 100, "abc"
    2 print(a, b, c)--100 abc nil
    3 
    4 a, b = b, a
    5 print(a, b, c)--abc 100 nil

    类型

    我们看看Lua内置的基本数据类型都有哪些:

    • nil:表示变量还没有被赋值,可以看做删除该变量的意思;
    • Boolean:布尔类型,true和false;
    • number:数字类型,内部以double表示;
    • string:字符串,总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串,而是其超集;
    • table:表,实际是一个关联数组,索引可以使用数字或字符串,不同于其他语言的数组把0作为数组的初始索引,在Lua里表的默认初始索引一般以1开始。table的变量只是一个地址引用,对table的操作不会产生table的副本或创建新的table,table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil;
    • function:函数,可以作为匿名函数来使用;
    • userdata:用户(非脚本用户)定义的C数据结构,脚本用户只能使用它,不能定义;
    • thread:Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样;

    接下来的笔记会着重介绍这些核心的基本数据类型。

    而判断变量究竟是什么类型依靠的是他的值,我们看看下面的例子:

     1 num = 100
     2 str = "abc"
     3 obj = nil
     4 func = print
     5 
     6 print(type(num))--number
     7 print(type(str))--string
     8 print(type(obj))--nil
     9 print(type(func))--function
    10 
    11 func = str
    12 
    13 print(type(func))--string

    全局和局部

    默认声明的变量都是全局变量,表示可以在全局范围内进行访问,而局部变量则是在声明之前添加local关键字,如下:

    1 local num
    2 local str = "abc"
    3 
    4 print(num)--nil
    5 print(str)--abc

    全局变量声明时必须赋值,而局部变量则不需要。

    do...end可以声明一个程序块,局部变量的生命周期在自己的程序块和子程序块中:

     1 function main()
     2   do
     3     local num = 100
     4     print(1, num)--1  100
     5     do
     6       print(2, num)--2  100
     7     end
     8   end
     9   print(3, num)--3  nil
    10 end
    11 
    12 main()

    运算符

    算术运算符

    包含“+”、“-”、“*”、“/”、“%”等运算符,但是要注意不支持自增自减运算符:

    1 num = 10
    2 --下面的写法都不支持, --直接变注释了都
    3 num++
    4 ++num
    5 num--
    6 --num
    7 --正确的写法如下
    8 num = num + 1
    9 num = num - 1

    同时简写的形式也不支持:

    1 num = 10
    2 --简写是不支持的
    3 num *= 5
    4 --正确的写法如下
    5 num = num * 5

    取余运算支持小数,因为number类型是以double形式存在的:

    1 num = 3.14
    2 num = num % 1
    3 print(num)--0.14

    关系运算符

    • ==:判断是否相等;
    • ~=:判断是否不相等;
    • <:判断是否小于;
    • >:判断是否大于;
    • <=:判断是否小于等于;
    • >=:判断是否大于等于;

    需要注意的是,table等引用类型是使用地址来进行判断的:

     1 num1 = 10
     2 num2 = 10
     3 print(num1 == num2)--true
     4 
     5 str1 = "abc"
     6 str2 = "abc"
     7 print(str1 == str2)--true
     8 
     9 table1 = {1, 2, 3}
    10 table2 = {1, 2, 3}
    11 print(table1 == table2)--false

    逻辑运算符

    • and:与,等同C里的&&;
    • or:或,等同C里的||;
    • not:非,等同C里的!;

    我们可以巧用逻辑运算符来实现C中的三元运算符:

    1 --C 语言的写法
    2 --d = a ? b : c
    3 --Lua 的写法
    4 d = (a and b) or c

    控制结构

    if then

    条件判断语句,我们直接上个例子:

     1 num = math.random()
     2 print(num)
     3 
     4 if num <= 0.33 then
     5   print("A")
     6 elseif num <= 0.66 then
     7   print("B")
     8 else
     9   print("C")
    10 end

    while和repeat

    条件循环语句,while是先判断再循环,repeat是先循环再判断,例子如下:

     1 num = 10
     2 
     3 --while 的条件是如果为真则继续循环
     4 while num ~= 0 do
     5   num = num - 1
     6   print(num)
     7 end
     8 
     9 num = 10
    10 
    11 --repeat 的条件是如果为真则退出循环
    12 repeat
    13   num = num - 1
    14   print(num)
    15 until num == 0

    for

    循环语句;

    1 --步长默认为 1
    2 for i = 0, 10 do
    3   print(i)
    4 end
    5 
    6 --指定步长为 2
    7 for i = 0, 10, 2 do
    8   print(i)
    9 end

    foreach

    迭代遍历语句,写法如下:

    1 days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
    2 
    3 --i 表示索引, v 表示值
    4 for i,v in ipairs(days) do
    5   print(i, v)
    6 end

    break和return

    用法和C中的一致,break用于跳出循环,而return用于跳出函数。

    不支持的switch、case和continue

    Lua中不支持switch-case语句,我们可以使用if elseif来代替;

    Lua中不支持continue语句,参考下面的文件来实现:http://www.jb51.net/article/59099.htm

    Lua在5.2的版本中加入了goto语句,可以用来实现continue的效果。

  • 相关阅读:
    bzoj1042 [ HAOI2008 ] --容斥原理+完全背包
    bzoj1079 [ SCOI2008 ] --记忆化搜索
    bzoj1584 [ Usaco2009 Mar ] --DP
    bzoj4724 [ POI2017 ] --数论
    bzoj3208--记忆化搜索
    bzoj3095--数学题
    resque 遍历加载job目录下的类
    php,js清除cookie
    nginx 设置 fastcgi缓存
    php缓冲区 sapi缓冲区
  • 原文地址:https://www.cnblogs.com/hammerc/p/4704813.html
Copyright © 2020-2023  润新知