lua基础(一)
参考链接:
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基础(一)的更多相关文章
- Lua 基础
Lua 5.3 的中文手册, http://cloudwu.github.io/lua53doc 在线浏览 --第一部分 -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 多行的注释. -- ...
- Lua基础 函数(一)
转自: http://blog.csdn.net/wzzfeitian/article/details/8653101 在Lua中,函数是对语句和表达式进行抽象的主要方法.既可以用来处理一些特殊的工作 ...
- Lua基础之MetaTable(6)
Lua基础之MetaTable(6) 转载地址:http://nova-fusion.com/2011/06/30/lua-metatables-tutorial/ 关于MetaTable的补充:ht ...
- Step By Step(Lua基础知识)
Step By Step(Lua基础知识) 一.基础知识: 1. 第一个程序和函数: 在目前这个学习阶段,运行Lua程序最好的方式就是通过Lua自带的解释器程序,如: /> l ...
- lua 基础 2 类型和值
-- 类型 和 值--[[ 8中类型 滚动类nil.boolean. number.string.userdata.function.thread 和 table.]] print (type(&qu ...
- lua 基础 1
--1.1 Chunks--[[Chunk 是一系列语句,Lua 执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个 Chunk.]] -- 1.2 全局变量--[[ 全局变量不需要声明,给 ...
- Lua学习----Lua基础数据类型
前言 Lua有6中数据类型,分别是nil(空).boolean(布尔).number(数字).string(字符).table(表).function(函数) 在Lua中可以使用type函数来返回一个 ...
- Lua基础
局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处 ...
- Lua基础之字符串(string)
1,计算字符串长度 2,返回字符串s的n个拷贝 3,返回字符串全部字母大写 4,返回字符串全部字母小写 5,返回一个类似printf的格式化字符串 6,根据下标截取字符串 7,在字符串中查找 8,在字 ...
随机推荐
- PHP-密码学算法及其应用-散列函数
转自http://www.smatrix.org/bbs/simple/index.php?t5591.html /////////////////////////////////////////// ...
- 心智图/思维导图(Mind Map/Mind Mapping),思维导图介绍
心智图(Mind Map),又称脑图.心智地图.脑力激荡图.思维导图.灵感触发图.概念地图.树状图.树枝图或思维地图,是一种图像式思维的工具以及一种利用图像式思考辅助工具来表达思维的工具. 心智图 ...
- python笔记-列表和元组
列表和元组: -可以将列表和元组当成普通的数组 -列表和元组可以保存任意类型的python对象 -通过从0开始的数字索引访问元素 -列表和元组可以存储不同类型的对象 列表和元组的区别: -列表元素使用 ...
- Python partition() 方法
描述 Python partition() 方法用来根据指定的分隔符将字符串进行分割. 如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符前面的子字符串,第二个为分隔符本身,第三个为分隔 ...
- int main() 与 int _tmain()
用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是&l ...
- localStorage使用总结,页面跳转,保存值
例子 <ul id="edit" contenteditable="true"> <li>修改我吧,然后刷新页面看看,^_^</l ...
- AppModify修改app.config
public class AppModify { /// <summary> /// 依据连接串名字connectionName返回数据连接字符串 /// </summary> ...
- 使用digitalocean搭建v·p·s
这几天digitalocean开始猛卡,一顿操作之后连不上了=_=遂复习了一下怎么搭vps 准备工作 事先准备好Putty,直接百度搜索下载即可(也可直接使用digitalocean的access c ...
- bazel-编译一个源文件生成可执行程序
demo1 使用bazel编译一个源文件生成可执行程序简单示例 demo1目录树 demo1 ├── app │ ├── BUILD │ └── hello_world.cpp ├── README. ...
- ngBind {{}} ngBindTemplate
1.首先我们最常使用的一个绑定表达式的指令是ngBind,比如在一个div标签中我们可以这样使用: <div ng-bind="vm.info"></div> ...