《Lua程序设计 第二版》学习笔记一
Lua简介
Lua是一种简单、可拓展、可移植及高效的脚本语言。
开始
Lua之间不需要分隔符
运行方式:
Linux下:
lua -i prog
dofile("lib1.lua")
- 函数定义:
function func()
return 123;
end
词法规范
标识符可以以任意字母、数字、下划线构成,但是不能以数字开头,避免下划线后面跟一个或多个大写字母,这类字符被Lua保留作为特殊用途。保留字有:and、break、do、else、elseif、end、false、for、function、if、in、local、nil、not、or、repeat、return、then、true、until、while。全局变量
全局变量不需要声明,删除直接赋值为nil本地变量
使用local声明
数据类型
- nil
- boolean
- number
- string
- table
- function
- userdata(自定义类型)
- thread(线程)
表达式
- 算数操作符:+ - * / ^(指数) -(负号)
- 关系操作符:< > <= >= == ~=
- 逻辑操作符:and or not,其中nil值视为false
- 字符串连接:..
- 优先级:直接使用括号分离
- table构造式 names = {"jack", "bill", "green"}
语句
- 赋值
a = "hello" .. "world"
t.n = t.n + 1
a, b = 10, 2 * x
x, y = y, x 交换
- 局部变量与块(block)
j = 10
local i - 1
使用关键字do-end可以控制局部变量作用域
do
local a = 10
...
end
- 控制结构
if then else
if a < 0 then a = 0 end
if a < b then return a else return b end
if line > MAXLINES then
showpage()
line = 0
end
if op == "+" then
r = a + b
elseif op == "-"
r = a -b
elseif op == "*"
r = a * b
else
error("Invalid operation")
end
while
local i = 1
while a[i] do
print(a[i])
i = i + 1
end
repeat
repeat
line = io.read()
until line ~= ""
print(line)
数字型for
for (var = exp1, exp2, exp3) do
<执行体>
end
var从exp1变化到exp2,每次以exp3作为步长递增var,并执行一次执行体、exp3是可选的,默认为1
for i = 1, 10 do print(i) end
for i = 10, 1, -1 do print (i) end
泛型for
for i, v in ipairs(a) do print(v) end
ipairs遍历数组的迭代器函数,每次循环中,i会被赋予一个索引值,v被赋予一个对应于该索引的数组元素值。
for k in pairs(t) do print(k) end
- break 和 return
...
函数
- 多重返回值
function maxinum (a)
local mi = 1;
local m = a[mi]
for i, val in ipairs(a) do
if val > m then
mi = i; m = val
end
end
return m, mi
end
print(maxinum({8, 10, 23, 12, 5})) --> 23 3
若将函数调用作为一条单独语句时,Lua会丢弃函数的所有返回值。若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。只有当一个函数调用是一系列表达式中的最后一个元素时,才能获得它的所有返回值。
unpack:接受数组为参数,并从下标1开始返回数组的所有元素。
print(unpack({10,20,21}))
a, b = unpack{10,20,21}
- 变长参数
function add(...)
local s = 0
for i, v in ipairs{...} do
s = s + v
end
return s
end
print(1,2,3,4)
function foo (...)
local a, b, c = ...
end
select("i", ...) 获取第i个变参参数
select("#", ...) 获取所有变参参数的总数
- 具名实参
rename{old="temp.lua", new="temp1.lua"}
function rename (arg)
return os.rename(arg.old, arg.new)
end
深入函数
闭包closure
非局部变量 non-local variable
function newCounter()
local i = 0
return function ()
i = i + 1
return i
end
end
c1 = newCounter();
print(c1())
print(c1())
c2 = newCounter();
print(c2())
print(c1())
print(c2())
非全局的函数
正确的尾调用
retun ()
迭代器与泛型
迭代器
迭代器的闭包实现:
function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
local vals = {1,100,32,123,42}
local iter = values(vals);
普通调用
print(iter())
print(iter())
遍历
for element in values(vals) do
print(element)
end
泛型for
for <var-list> in <exp-list> do
<body>
end
协同程序
协程拥有自己独立的栈、局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西。从概念上线程和协程的主要区别在于:一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此写作的运行。就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协程程序,并且正在运行的协同程序只会在其显示地要求挂起时,它的执行才会暂停。
co = coroutine.create(function() print("hi") end)
print(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
《Lua程序设计 第二版》学习笔记一的更多相关文章
- Java多线程编程实战指南(核心篇)读书笔记(五)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- 《Java多线程编程实战指南(核心篇)》阅读笔记
<Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...
- 学习笔记《Java多线程编程实战指南》三
3.1串行.并发与并行 1.串行:一件事做完接着做下一件事. 2.并发:几件事情交替进行,统筹资源. 3.并行:几件事情同时进行,齐头并进,各自运行直到结束. 多线程编程的实质就是将任务处理方式由串行 ...
- 学习笔记《Java多线程编程实战指南》二
2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于 ...
- 学习笔记《Java多线程编程实战指南》一
1.1什么是多线程编程 多线程编程就是以线程为基本抽象单位的一种编程范式,和面向对象编程是可以相容的,事实上Java平台中的一个线程就是一个对象.多线程编程不是线程越多越好,就像“和尚挑水”的故事一样 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...
随机推荐
- zabbix监控模式、分布式、自动化
适用场景: 1.监控主机多,性能瓶颈 2.多机房,防火墙 zabbix监控模式 针对agent来说 - 被动模式 - 主动模式(主动汇报服务端) 1)当监控主机超过300台,建议使用主动模式 2)当队 ...
- BZOJ1568: [JSOI2008]Blue Mary开公司
可以平衡树或线段树维护斜率来做. 还有一种线段树直接打标记的做法: 线段树每个节点存一条线段作为标记,打标记时如果已有标记,则把占优区间小的那个线段下放. #include<cstdio> ...
- BZOJ4590: [Shoi2015]自动刷题机
显然看着就是二分,仔细看的话显然刷的题数随n增大单调不升. 挂了一发是因为无解输出一个-1而不是两个…… #include<cstdio> #include<algorithm> ...
- js017-错误处理与调试
js017-错误处理与调试 本章内容 理解浏览器报告的错误 处理错误 调试JS代码 17.2 错误处理 17.2.1 try-catch语句 try{ //possible error code }c ...
- MySQL------如何将SQLServer文件数据迁移到MySQL
转载: http://blog.csdn.net/zhangdaiscott/article/details/46412453
- select例子
好长时间没有写了,其实一直在坚持学习. #include <sys/types.h> #include <sys/socket.h> #include <stdio.h& ...
- win10系统点击关机按钮后无法关机的解决办法
先吐槽下:我越发的发现我现在成了修电脑的了,我的职位是linux运维,现在干的活很蛋疼,公司只有我一个运维,修电脑.搞网络.抬服务器.弄监控,搭环境.搞自动化发布.弄虚拟化都我一个人哇.好了,打住. ...
- Java Native Interface Specification
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html http://www.ibm.com/develo ...
- Fork函数初识
fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...
- phpize 扩展GD库 安装 ! 环境--centos 7 +nginx 1.7.11+php 5.6.7
使用phpize编译GD库安装,先安装前置库libjpeg libpng zlib freetype等 都是下面php编译的几个选项 先看php编译的选项: --with-gd=DIR ...