Lua学习一
来源:互联网 发布:佳能手机打印软件 编辑:程序博客网 时间:2024/05/01 07:36
本文相当于《lua程序设计第二版》的一个笔记 (本书一共31章节)
lua下载
第一章,开始
print("hello world")
将上面这个保存到 hello.lua 文本中,然后 lua hello.lua 就会看到结果了。
来一个阶乘的例子
--定义一个阶乘函数function fact(n) if n==0 then return 1 else return n*fact(n-1) endendprint("enter a number:")a=io.read("*number")--读取一个数字print(fact(a))
运行如下:
E:\program\lua 的目录2015/06/24 10:44 <DIR> .2015/06/24 10:44 <DIR> ..2015/06/24 10:41 200 fact.lua2015/05/19 22:49 298,917 lua53.dll2015/04/24 01:03 93,861 lua53.exe2015/05/19 22:51 228,669 luac53.exe2015/05/19 22:51 95,533 wlua53.exe 5 个文件 717,180 字节 2 个目录 234,745,798,656 可用字节E:\program\lua>lua53 fact.luaenter a number:5120E:\program\lua>
1.1 程序块
lua多条语句可以使用也可以不适用分号(;)比如下面的语句是一样的
a=1b=a*1-----------a=1 b=a*2
运行 lua进入交互模式
E:\program\lua>lua53Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio>
1.1未完待续
1.2词法规范
lua的标识符 字母数字下划线(数字不能开头),下划线和大写字母开头在lua中专用特殊用途,lua区分大小写,and是一个保留字,lua的保留字有一下:
--lua 保留字and break do else elseif endfalse for function if inlocal nil not or repeatreturn then true until while
1.3 全局变量
全局变量不需要声明,比如 a=1 就会产生一个全局变量,lua中访问一个没声明的变量不会发生错误,会得到一个nil
1.4解释器程序
未完待续
第二章 类型和值
--lua有8种基本类型--nil(空) boolean(布尔) number(数字) string(字符串) --userdata(自定义类型) function(函数) thread(线程) table(表)print(type("hello world"))--stringprint(type(10.4*3))--numberprint(type(print))--functionprint(type(type))--functionprint(type(true))--booleanprint(type(nil))--nilprint(type(type(X)))--string
lua中函数是作为第一类值对待
2.1 nil(空)
全局变量赋值前就是nil ,将nil赋值给一个全局变量相当于删除它,nil(无效数值)
2.2 boolean
lua中除了 false和nil,其他都是真
2.3 number
number 类型表示实数, 4 ,0.4, 4.75e-3
2.4 string
未完待续
2.5 table 表
未完待续
2.6function(函数)
未完待续
第三章 表达式
lua 支持的算术操作符有+-*/%就基本的这些都有
3.2 关系操作符
<,>,<=,>=,~=(不等) nil只与自身相等。
字符串比较是按字母次序。
数字和字符串之外的其他类型只能进行相等性或不等性比较。
3.3逻辑操作符
逻辑运算符 and or not ,
and和or使用“短路求值”
3.4字符串连接
字符串连接是“..”(两个点)操作符
a="hello "print(a.."world")--hello world
3.5 优先级
1. ^ 2. not # - 3. * / % 4. + - 5. .. 6. < > <= >= ~= == 7. and 8. or
3.6 table构造式
待续
第四章
4.1赋值
lua允许多重赋值a,b=1,2这样,交换a,b=b,c 如果有多余的则赋值为nil,也就是静静的丢弃掉
4.2局部变量与块
j=10 --全局变量local i=1 --局部变量,通过local语句创建局部变量
局部变量的作用域仅限于声明他们的那个快,一个快是一个控制结构的执行体,或者是一个函数的执行体,再或者是一个程序块
x=10local i=1 --程序块中的局部变量 while 1<=x do local x=i*2 --while循环体中的局部变量 print(x) --2,4,6,8 i=i+10endif i>20 then local x --then 中的局部变量 x=20 print(x+2) --如果测试成功会打印22else print(x) --10 全部变量endprint(x) --10 全部变量
尽可能使用局部变量是一个好的编程习惯
在lua中 local foo=foo 将全部变量赋值给局部变量
4.3控制结构
if a<0 then a=0 end
嵌套if可以使用elseif可以避免潜逃中出现的多个end
if op=="+" then r=a+belseif op=="-" then r=a-belse error("ddddd")end
while
local i=1while a[i] do print(a[i]) i=i+1end
repeat line=io.read() until line~=""print(line)--repeat中的局部变量在until中仍然可以访问到
数字for
for i=1 ,f(x) do print(i) end--第三个表达式可选的,如果不指定则加1for i=1 ,f(x),-1 do print(i) end
泛型for
for k in pairs(t) do print(k) end
4.4break与return
break和return 没啥好说的。
第五章 函数
一个函数若只有一个参数,并且此参数是一个字面字符串或者table构造式,那么圆括号可有可无,如:
print "hello world" --print("hello world")dofile 'a.lua' --dofile('a.lua')print[[a multi-line message]] --print([[a multi-line message]])f{x=10.y=20} --f({x=10.y=20})type{} --type({})
lue为对象式调用提供了一种特使的用法-冒号操作符:o.foo(o,x) 另一种写法o:foo(x)
function f(a,c) return a or b end--一个函数f(3)--a=3 b=nilf(3,4)--a=3,b=4f(3,4,5)--a=3,b=4,5被丢弃
5.1多重返回值
s,e=string.find("hello Lua users","Lua")print(s,e)--7 9这是一个多返回值
5.2变长参数
function add(...)local s=0 for i,v in ipairs{...} do s=s+v end return sendprint(add(3,4,10,25,12))--54可变参数
5.3具名实参
待续
第六章 深入函数
6.1 closure闭合函数
若一个函数写在另一个函数的内部,内部的函数可以访问外部函数的局部变量,这个叫做“词法域”。
--这是一个对学生姓名进行排序的例子names={"Peter","Paul","Mary"}grades={Mary=10,Paul=7,Peter=8}table.sort(names,function(n1,n2) return grades[n1]>grades[n2]--比较年级end)--假设我们要自己实现这个例子function sortbygrade(names,grades)table.sort(names,function() return grades[n1]>grades[n2]--比较年级end)end--在这里例子中匿名函数是函数可以访问grades--而grades是sortbygrade的局部变量。在这个匿名函数的内部,grades--既不是全局变量也不是局部的,在lua中叫做"非局部的变量"--附:这个其实就是自由变量了。
为什么lua允许这样访问呢,原因在于函数是”第一类值”(先解释第一类值
在JavaScript中 var c=function(){} 这样可以把一个函数赋值给一个变量,函数和number一样,这样的语言就是 所谓的第一类值,比如java中,就没办法这么做。)
function newCounter()local i=0 return function() i=i+1 return i endend---------------c1=newCounter()print(c1())--1print(c1())--2----------------c2=newCounter()print(c2())--1print(c1())--3print(c2())--2--如上 书上这么说的 从技术上讲,Lua中只有closure 而不存在"函数" 因为函数本身就是一种特殊的clousure--注意 在这里创建闭合函数的时候其实做了一个i的副本。就是说有几个闭包就有几个i的副本。--这个其实也没啥。他只有可能这么干。这段代码我翻译成js试试 如下,结果是一致的,他只有可能这么干function newCounter(){var i=0 return function(){ i=i+1 return i }}//---------------var c1=newCounter()console.log(c1())//1console.log(c1())//2//----------------var c2=newCounter()console.log(c2())//1console.log(c1())//3console.log(c2())//2
6.2非局部的函数
没啥说的,意思函数可以存放table中,存放到其他数据结构中
6.3正确的尾调用
lua支持尾递归优化,赞。虽然语言支持尾递归,但是必须写出尾递归的代码才行。
function foo(n) if n>0 then return foo(n-1) endend--比如这个代码,无论n是几,都不会出现栈溢出。因为程序不需要记录之前栈调用。这个代码在java中试了一下java.lang.StackOverflowError ,果然java不支持尾递归。
在lua中,只有 return[func][args]这样才算是“尾调用”
lua尾调用待续
附录:
① -#是表的长度运算符 t = {“a”, “b”, “c”, “d”},#t –输出是4
②:
Lua中的
loadfile只加载文件,啥都不做
dofile加载文件并且执行文件的内容
require加载文件并且只执行一次
- lua学习(一)
- Lua学习笔记一
- Lua学习笔记一
- Lua学习笔记一
- Lua学习笔记一
- Lua学习进阶一
- lua学习(一)
- Lua基础学习(一)
- Lua学习 一
- Lua学习笔记一
- Lua 学习笔记 一
- lua学习一
- Lua 学习笔记(一)
- Lua学习一
- lua学习初探【一】
- Lua学习一
- Lua基础学习(一)
- lua 学习笔记 一
- Flash Builder找不到所需的调试器版本
- 网站
- 第十六周项目1-平方根中的异常
- UE4项目学习——2D跑酷游戏尝试(蓝图脚本)1
- C++为什么不加入垃圾回收机制
- Lua学习一
- 【CUDA并行编程之六】KNN算法的并行实现
- YTU-OJ-虚基类练习:动物
- 浅析在网页设计中如何让按钮激发用户点击欲望
- YTU-OJ-熟悉题型——填空题(删除线性表节点)
- iOS UI Label控件
- 打印样式
- YTU-OJ-C++时间类的运算符重载
- 求质数