Lua基础学习1——类型和运算符

来源:互联网 发布:工控组态软件 编辑:程序博客网 时间:2024/05/17 04:01

版权声明:本文由( 小塔 )原创,转载请保留文章出处!

本文链接:

http://www.zaojiahua.com/lua-type.html


首先是最基础的Lua类型,下面一一介绍

--nil--Lua中特殊的类型,他只有一个值:nil。一个全局变量没有被赋值以前默认值为nil,给全局变量赋nil可以删除该变量。print(i)i = nil--booleans--两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,--其他值都为真。所以Lua认为0和空串都是真。这一点要特别注意,我们习惯了在其他语言中以非零和零区别真假,要注意Lua中是不一样的。--numbers--表示实数,Lua中没有整数。用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。--strings--字符串类型,Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串local a = "hello lua"local b = string.gsub(a,"hello","hi")print(a) --hello luaprint(b) --hi lua--可以使用单引号或者双引号表示字符串a = "a line"b = 'another line'--lua同样支持转义字符--\a bell--\b back space               -- 后退--\f form feed                -- 换页--\n newline                  -- 换行--\r carriage return          -- 回车--\t horizontal tab           -- 制表--\v vertical tab--\\ backslash                 -- "\"--\" double quote             -- 双引号--\' single quote             -- 单引号--还可以使用[[...]]表示字符串。这种形式的字符串可以包含多行,也可以嵌套且不会解释转义序列,--如果第一个字符是换行符会被自动忽略掉。local code = [[\b back space               -- 后退\f form feed                -- 换页\n newline                  -- 换行]]print(code)--运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,--string就会被转成数字。print("10" + 1)             --> 11--当Lua期望一个string而碰到数字时,会将数字转成string。..是字符串连接符,将字符串连接起来,当连接俩个数字的时候,注意数字后边要有空格print(10 .. 20)      --> 1020--如果需要显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。--反之,可以调用tostring()将数字转成字符串,这种转换一直有效print(1+tonumber(2)) -->3print(tostring(100)) -->100--function--函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。很强大的,遇到函数的时候只需要将函数看成变量就好了,以后就深有体会了。--Userdata and Threads--userdata就是用户数据类型,指的是自己定义的类型,userdata在Lua中除了赋值和相等比较外没有预定义的操作,Cocos中导出给我们的接口都是Userdata。--thread代表线程--table表 比较重要 以上三个数据类型在其他博客说明。--变量的作用域--全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,--只不过得到的结果是:nil.print(i) -->nil--声明一个局部变量使用local 局部变量只在局部代码块中有效,比如在循环中,if语句中,do end代码块中--我们应该尽可能的使用局部变量local j = 1do    local k = 1endprint(k) -->nil--关于全局变量和局部变量的不同举一个小例子。我们有俩个文件,一个是main.lua,一个是B.lua,在main.lua中有一个全局变量一个局部变量,如下。--main.luaxiaotablog = "zaojiahua"local zaojiahua = "xiaotablog"--在B.lua中我们这样访问这俩个变量require "src/main"print(xiaotablog) --zaojiahuaprint(zaojiahua) --nil--通过以上得例子就知道了全局变量和局部变量的区别吧,require是加载Lua模块用的,加载的时候全局变量要放到全局的表中,而局部变量只在作用域内有效。当在B.lua中访问的时候发现了全局变量xiaotablog和zaojiahua,然后去全局表里边查找,只能找到xiaotablog,所以zaojiahua就是nil--标示符--字母(letter)或者下划线开头的字母、下划线、数字序列.最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。比如_G就是上边说的全局表。--注意:Lua是大小写敏感的.--注释:单行注释:----多行注释:--[[    --]]


接下来是Lua的运算符
--算术运算符--二元运算符:+ - * / ^  (加减乘除幂)--一元运算符:-  (负值)--这些运算符的操作数都是实数,Lua中没有自增自减的运算符,这一点经常让我的同事吐槽,每次要写个自增都不自觉的使用++,然后发现Lua中没有这个运算符,连+=也没有,所以也只能写a = a+1了。--关系运算符-- <      >      <=     >=     ==     ~=--这里需要注意的是不等于是用~=表示的--这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;--nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等,这一点也很重要,以后一定会碰到的。--Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,数字和字符串类型不一样,所以一定是falseprint("0" == 0)       -- falsea = {1,2}b = {1,2}c = aprint(a==c) -->trueprint(a==b) -->falseprint(2 < 15 )        -- trueprint("2" < "15" )    -- false--逻辑运算符--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,否则返回bprint(false and 13)      --> falseprint(4 or 5)            --> 4print(false or 5)        --> 5--一个很实用的技巧:C语言中的三元运算符a ? b : c 在Lua中可以这样实现:(a and b) or clocal a = 1local b = 2local num = (a>b and a) or bprint(num) -->2--连接运算符--..两个点--字符串连接,如果操作数为数字,Lua将数字转成字符串。注意数字之间的空格print("Hello ".."lua")      --> Hello luaprint(0 .. 1)               --> 01


0 0
原创粉丝点击