参考链接:

http://blog.csdn.net/lyh916/article/details/49719697

一、注释

--这是行注释 

--[[
这是块注释
这是块注释
这是块注释
--]] --如果想取消块注释,只需将 --[[ 改为 ---[[

二、类型与值

--lua有8种基础类型:nil/boolean/number/string/userdata/function/thread/table
--即空/布尔/数字/字符串/自定义类型/函数/线程/表
--函数type可根据一个值返回其类型名称 print(type("HelloWorld")) --string
print(type(10)) --number
print(type(print)) --function
print(type(type)) --function
print(type(true)) --boolean
print(type(nil)) --nil
print(type(type(X))) --string 因为type函数总是返回一个字符串

--变量没有预定义的类型,任何变量都可以包含任何类型的值 

print(type(a))                  --nil
a = 10
print(type(a)) --number
a = "Hello"
print(type(a)) --string
a = print --函数是一种类型
a(type(a)) --function

nil:它只有一个值nil,作用类似于其他语言的null,可以将nil赋予一个变量表示删除这个变量

boolean:取值为true或者false。在lua中,false和nil表示假,除此之外的其他值为真

number:表示双精度浮点数(double)

string:字符串是不可变的值,不能直接修改字符串中的某个字符,若要修改,则要新建一个新的字符串。

字符串由一对单引号或者一对双引号来表示:a = "a line"       b = 'another line'

常用的转义字符:\n-----换行     \\-----反斜杠     \"-----双引号     \'-----单引号

另外,还可以用一对匹配的双方括号来表示一个字符串,这时将会忽视转义字符:

page = [[
<html>
<head>
<title>an htmlpage</title>
</head>
<body>
<ahref="http://www.lua.org">Lua</a>
</body>
</html>
]]
print(page) --字符串全部打印,但双方括号要只有一对

lua还提供了运行时的数字与字符串的自动转换:

--字符串转数字
print("10" + 1) --11
print("10" +"1") --11 --数字转字符串
print(10) --10
print(10 .. 20) --1020 --..是字符串连接操作符,当直接在一个数字后面输入它时,
--必须要用一个空格来分隔它们,不然lua会将第一个点理解为小数点

--比较10=="10"总为false,因为10是数字,"10"是字符串
--以上是隐式转换,使用tonumber/tostring可以显示转换 print(tostring(10) =="10") --true
print(10 .. "" =="10") --true --#可以换取字符串的长度
a = "hello"
print(#a) --5

table:类似于哈希表。table中的key可以是任何类型的值(除了nil)。table的创建是通过构造表达式完成的。最简单的构造表达式就是{}

a = {}                --创建一个table,并将它的引用存储到a
k = "x"
a[k] = 10 --key="x",value=10
a[20] = "great" --key=20,value="great" print(a["x"]) --10
print(a[20]) --great
a["x"] =a["x"] + 1
print(a["x"]) --11

a = {}                --创建一个table,并将它的引用存储到a
a["x"] = 10
b = a --b与a引用了同一个table print(b["x"]) --10
b["x"] = 20
print(a["x"]) --20
a = nil --现在只有b还在引用table
b = nil --再也没有对table的引用了
a = {}
x = "y"
a[x] = 10
print(a[x]) --10
print(a.x) --nil
print(a.y) --10 --a.x等同于a["x"]

--若要表示一个传统的数组或者线性表,只需以整数作为key来使用table即可
--不同于许多语言,lua习惯以1作为数组开始
a = {}
for i = 1,5 do
a[i] = i
end --#长度操作符,可获取table或者字符串的长度
for i = 1,#a do
print(a[i]); --1到5
end --注意是以1作为数组开始
print(a[#a]) --5
a[#a] = nil --删除a[5]
a[#a+1] = 10 --a[5]=10
print(a[#a]) --10

请记住对于所有未初始化的元素的索引结果都是nil。lua将nil作为界定数组结尾的标志。如果数组中含有nil,此时使用#就不安全了,可以使用table.maxn,它将返回一个table的最大正索引数。

a = {}
for i = 1,5 do
a[i] = i
end a[4] = nil
print(#a) --3
print(table.maxn(a)) --5

三、表达式

lua的操作符跟c大致相同,除了以下的:

其他语言

lua

!=

~=

&&

and

||

or

!

not

注意:

and:如果第一个操作数为假,则返回第一个操作数;否则返回第二个操作数。

or:如果第一个操作数为真,则返回第一个操作数;否则返回第二个操作数。

table构造式:

table有三种方式进行初始化:

1.

days ={"Sunday","Monday","Tuseday"}

上面只指定了value,但没有指定key。这种情况下,lua会给没有key的value指定一个默认的key,从1开始,每次加1递增。

days ={"Sunday","Monday","Tuseday"}
print(days[0]) --nil
print(days[1]) --Sunday
print(days[2]) --Monday

2.

a = {x = 10,y = 20}     --等价于a={};a.x=10;a.y=20
print(a["x"]) --10
print(a["y"]) --20

混合使用:

polyline ={color="blue",thickness=2,npoints=4,
{x=10,y=20},
{x=30,y=40},
{x=50,y=60},
{x=70,y=80},
}
print(polyline[2].x) --30
print(polyline[4].y) --80

3.

opnames = {
["+"] ="add",
["-"] ="sub",
["*"] ="mul",
["/"] ="div",
} i = 20;s = "+"
a = {
[i+0] = s,
[i+1] = s..s,
[i+2] = s..s..s,
} print(opnames[s]) --add
print(a[22]) --+++

四,语句

多重赋值:将多个值赋予多个变量
a,b = 10,20
print(a) --10
print(b) --20 --在多重赋值中,lua先对等号右边的所有元素求值,然后才执行赋值
--利用这个特性,可以很好地实现变量的值交换 a,b = b,a
print(a) --20
print(b) --10 --若值的个数少于变量的个数,那么多余的变量会被赋值为nil
--若值的个数多于变量的个数,那么多余的值会被丢弃 a,b,c = 1,2
print(a,b,c) --1 2 nil
a,b,c = 10,20,30,40
print(a,b,c) --10 20 30

局部变量与块:

与全局变量不同的是,局部变量的作用域仅限于声明它们的那个块。一个块是一个控制结构的执行体、或者是一个函数的执行体再或者是一个程序块。

x = 10               --全局变量
local i = 1 --局部变量 while i <= x do
local x = i * 2
print(x) --2,4,6。。。
i = i + 1
end if(i > 20) then
local x = 20
print(x + 2)
else
print(x) --10,全局变量
end print(x) --10,全局变量

请注意,如果是在交互模式中输入这段代码的话,该示例可能不会如预期的那样工作。因为在交互模式中每行输入内容自身就形成了一个程序块。一旦输入了本例的第二行local i = 1 ,lua会马上运行这句话,并为下一行的运行开启一个新的程序块。到那时local声明就已经超出其作用域。为了解决这个问题,可以显式地界定一个块,只需将这些内容放入一对do-end中即可。当输入了do,lua就不会单独地执行后面每行的内容,而是直至遇到一个相应的end时,才会执行整个块的内容。



控制结构:

--------------------if----------------
a = 70 if (a < 100 and a >= 80)then
print("A")
elseif (a < 80 and a >= 60)then
print("B")
else
print("C")
end --------------------while----------------
local i = 1
while (i <= 3) do
print(i)
i = i + 1
end --------------------repeat----------------至少执行一次循环体
local i = 10
repeat
i = i + 1
print(i)
until (i > 13) --------------------数字型for----------------
for i = 100,103,1 do --100到103,步长为1,其中步长可以省略,默认步长为1
print(i) --for的三个值是循环前一次性求值的
end --控制变量在循环结束后就不存在了 --------------------泛型for----------------
a ={"one","two","three"}
for i,v in ipairs(a) do --i为索引值,v为对应元素值
print("第"..i.."个元素为"..v)
end b ={x="xx",y="yy",z="zz"}
for k,v in pairs(b) do
print("键 "..k.." 值 "..v)
end --标准库提供了几种迭代器,包含用于迭代文件中每行的io.lines
--迭代数组的ipairs,迭代table的pairs,迭代字符串中单词的string.gmatch --lua中的break和return与其他语言类似,所以省略

lua基础(一)的更多相关文章

  1. Lua 基础

    Lua 5.3 的中文手册, http://cloudwu.github.io/lua53doc 在线浏览 --第一部分 -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 多行的注释. -- ...

  2. Lua基础 函数(一)

    转自: http://blog.csdn.net/wzzfeitian/article/details/8653101 在Lua中,函数是对语句和表达式进行抽象的主要方法.既可以用来处理一些特殊的工作 ...

  3. Lua基础之MetaTable(6)

    Lua基础之MetaTable(6) 转载地址:http://nova-fusion.com/2011/06/30/lua-metatables-tutorial/ 关于MetaTable的补充:ht ...

  4. Step By Step(Lua基础知识)

    Step By Step(Lua基础知识) 一.基础知识:    1. 第一个程序和函数:    在目前这个学习阶段,运行Lua程序最好的方式就是通过Lua自带的解释器程序,如:    /> l ...

  5. lua 基础 2 类型和值

    -- 类型 和 值--[[ 8中类型 滚动类nil.boolean. number.string.userdata.function.thread 和 table.]] print (type(&qu ...

  6. lua 基础 1

    --1.1 Chunks--[[Chunk 是一系列语句,Lua 执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个 Chunk.]] -- 1.2 全局变量--[[ 全局变量不需要声明,给 ...

  7. Lua学习----Lua基础数据类型

    前言 Lua有6中数据类型,分别是nil(空).boolean(布尔).number(数字).string(字符).table(表).function(函数) 在Lua中可以使用type函数来返回一个 ...

  8. Lua基础

    局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处 ...

  9. Lua基础之字符串(string)

    1,计算字符串长度 2,返回字符串s的n个拷贝 3,返回字符串全部字母大写 4,返回字符串全部字母小写 5,返回一个类似printf的格式化字符串 6,根据下标截取字符串 7,在字符串中查找 8,在字 ...

随机推荐

  1. 工作总结 表单提交中 Input 设置 disabled readonly

    input框里面添加disabled属性之后,该内容就无法向上提交  需要的时候也可以再移除disabled readonly这个属性来禁止用户修改, 可以正常提交. Hiddent 隐藏  也可以正 ...

  2. Mycat和MySQL的差别——Mycat的核心作用

    有个朋友面试的时候被问到:Mycat和MySQL的差别.我们能够把上层看作是对下层的抽象,比如操作系统是对各类计算机硬件的抽象.那么我们什么时候须要抽象?假如仅仅有一种硬件的时候,我们须要开发一个操作 ...

  3. map集合的循环示例

    /** * 报警状态下拉列表信息 * @return * @throws Exception */ public String alarmStatusList() throws Exception { ...

  4. Netty(四):粘包问题描述及解决

    拆包粘包问题解决 netty使用tcp/ip协议传输数据.而tcp/ip协议是类似水流一样的数据传输方式.多次访问的时候有可能出现数据粘包的问题,解决这种问题的方式如下: 1 定长数据流 客户端和服务 ...

  5. Ubuntu下安装java

    1.首先到java.com下载最新版本的jdk.下面是jdk8的网址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  6. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  7. win32环境下显示中文

    //编码转换 //#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) // string title = "成绩"; // GBK2UTF8 ...

  8. sensor dma alloc failed问题

    打印信息 [CAPTURE][printCapCapbility:93]:D/ driver:sunxi-vfe [CAPTURE][printCapCapbility:94]:D/ card:sun ...

  9. IP地址欺骗

    1.什么是IP地址欺骗按照IP网络协议,数据包头包含来源地和目的地信息,而IP地址欺骗,就是通过伪造数据包爆头,使显示的信息源不是实际的来源,就像这个数据包是从另一台计算机上发送的. 2.IP地址欺骗 ...

  10. 每日英语:The Perils Of Giving Advice

    I know what you should do and here's my advice. How many times have you heard that (and groaned)? gr ...