• Lua语法基础(1)---简介、基本数据类型、表达式


    我觉得我已经陷入了一个坑内。因为,安装了Lua和SublimeText3编辑器之后,怎么使自己编写的lua代码在untiy内运行起来,是个我完全不了解的机制。先放一放吧。首先,来回顾一下Lua的语法基础。

    第一 起点

    在Lua中具有一个Chunks的概念。Chunk是一系列语句,Lua执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个Chunk。一个代码块,可以是一个语句,一系列语句的组合,或者一个函数。

    注意,在交互模式下,Lua通常把每一个行当作一个Chunk,但如果Lua一行不是一个完整的Chunk时,他会等待继续输入直到得到一个完整的Chunk.在Lua等待续行时,显示不同的提示符(一般是>>)。这个其实,木有太有用哦。

    当然,Lua和其他语言一样,也有关键字,大体如下:

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

    注意:Lua是大小写敏感的。

    单行注释: -- 

    块注释:--[[     ]]

    第二 基本数据类型

      Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。函数type可以测试给定变量或者值的类型。

      Nil :一个全局变量没有被赋值以前,默认值为nil,给一个变量赋值为nil,表示释放该变量。

      Boolean:只有两个值,true和false。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。

      Numbers:表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers。

      Strings:指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着可以存储任意的二进制数据在一个字符串里。

      a、类型转换

      运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。另外,也可以使用tonumber()函数和tostring()函数显式地进行字符与数字的转换。tonumber()函数转换时,如果string不是正确的数字该函数将返回nil。 见代码实例:

    --字符与数字的隐式转换
    print("10" + 7)
    --输出结果为:17,将字符10隐私转化为Number类型计算
    print("hello" + 7)
    --无法进行运算,即不能隐式将"hello"字符转化为Number计算
    --[[
       系统错误如下:
    stdin:1: attempt to perform arithmetic on a string value  
    stack traceback:  
        stdin:1: in main chunk  
        [C]: ?  
    --]]
    
    
    
    --字符与数字的显式转换
    print(tonumber("100")+11)
    --输出结果为:111
    print(type(tostring(100)))
    --输出结果为:string

        b、常用的字符处理函数介绍

    string.char()函数根据传入的ASCII编码返回该编码对应的字符。如:string.char(10),表示字符换行符,10是换行符的ASCII编码。    

    string.len()函数求字符串的长度。
    string.sub(aString, start, end) 函数返回指定字符串的子串。
    string.format()函数格式化输出指定字符串。%s表示字符串,%d表示所有数字,%D表示非数字,%a表示字母,%c表示控制字符,%l小写字母,%p标点符号,%s空格符号,%u大写字母,%w字母数字,%x十六进制数,%z用0表示的字符。加%前缀可以让特殊符号也能用在格式化中(如:().%+_*?[ ^ $ ]),如%%代表百分比符号。%.4f表示小数点后有4位的浮点数,%02d.表示至少有两个数字的整数,如果不足两个数字则用0补足。
    sting.find(sourceString, targetString) 函数在sourceString字符串中查找第一个符合targetString字符串的位置,如果找到则返回开始和结束的位置,没找到则返回nil。
    string.gsub(sourceString, pattern, replacementString) 函数返回一个字符串,sourceString字符中满足pattern格式的字符都会被替换成replacementString参数的值。
    string.gfind(sourceString, pattern) 函数遍历一个字符串,一旦查找到符合指定格式的字符串就返回该子串。
     
    Functions:函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。Lua可以调用lua或者C实现的函数,Lua所有标准库都是用C实现的。标准库包括string库、table库、I/O库、OS库、算术库、debug库。
     
    Userdata和Thread:userdata在Lua中除了赋值和相等比较外没有预定义的操作。
     
    第三 表达式
      Lua中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。还可以是非传统的函数定义和表构造。
      算术表达式: 二元运算符 + - * / ^ (加减乘除幂),一元运算符 -(负值)。其中这些运算符的操作数都是实数。
      关系运算符: < > <= >= == ~=。这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。
      逻辑运算符: and or not。
    值得注意的是,逻辑运算符认为false和nil是假(false),其他为真,0也是true.
    and和or的运算结果不是true和false,而是和它的两个操作数相关。
    a and b -- 如果a为false,则返回a,否则返回b
    a or b -- 如果a为true,则返回a,否则返回b

    例如:

    print(4 and 5) --> 5
    print(nil and 13) --> nil
    print(false and 13) --> false
    print(4 or 5) --> 4
    print(false or 5) --> 5

    一个很实用的技巧:如果x为false或者nil则给x赋初始值v

    x = x or v
    
    等价于
    
    if not x then
    x = v
    end

    and 的优先级比or高。

    C语言中的三元运算符可以在Lua中实现,如下:

    a ? b : c
    等价于
    (a and b) or c 或者直接写成 a and b or c

    not的结果一直返回false或者true

    print(not nil) --> true
    print(not false) --> true
    print(not 0) --> false
    print(not not nil) --> false

    连接运算符:字符串连接,如果操作数为数字,Lua将数字转成字符串。

    最重要的运算符的优先级,从高到低的顺序:

    ^
    not    - (unary)
    *     /
    +     -
    ..
    <     >     <=     >=     ~=     ==
    and
    or
    
    除了^和..外所有的二元运算符都是左连接的。
    a+i < b/2+1             <-->            (a+i) < ((b/2)+1)
    5+x^2*8                 <-->            5+((x^2)*8)
    a < y and y <= z        <-->            (a < y) and (y <= z)
    -x^2                    <-->            -(x^2)
    x^y^z                   <-->            x^(y^z)

    Table表的构造

    构造器是创建和初始化表的表达式,可以用{}创建一个空表。也可以直接初始化数组:
    days = {"Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday"}

    如果想初始化一个表作为record使用可以这样:

    a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0

    不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。

    w = {x=0, y=0, label="console"}
    x = {sin(0), sin(1), sin(2)}
    w[1] = "another field"
    x.f = w
    print(w["x"]) --> 0
    print(w[1]) --> another field
    print(x.f[1]) --> another field
    w.x = nil -- remove field "x"

    还可以将表table作为table的一个成员,从而构成多维表。

    polyline = {color="blue", thickness=2, npoints=4,
    {x=0, y=0},
    {x=-10, y=0},
    {x=-10, y=1},
    {x=0, y=1}
    }
  • 相关阅读:
    js获取鼠标的位置
    去掉a标签的虚线框,避免出现奇怪的选中区域
    点击按钮 可以显示隐藏
    input标签获取焦点时文本框内提示信息清空背景颜色发生变化
    ie6下面不支持!important的处理方法
    [zz]【整理】Python中Cookie的处理:自动处理Cookie,保存为Cookie文件,从文件载入Cookie
    [vim]大小写转换
    [zabbix]zabbix2.0apt源安装
    [mysql]replace
    [ethernet]ubuntu更换网卡驱动
  • 原文地址:https://www.cnblogs.com/slysky/p/5367432.html
Copyright © 2020-2023  润新知