#!/home/auss/Projects/Qt/annotated/lua
-- 这是第一次系统学习Lua语言
--[[
参考资料:
1. [Lua简明教程](http://coolshell.cn/articles/10739.html)
2. [Lua基础 类型和值](http://blog.csdn.net/wzzfeitian/article/details/8292130)
3. [Lua Reference Mannual](http://www.lua.org/manual/5.3/)
4. [Lua开发者](http://book.luaer.cn/)
5. [Lua手册](http://manual.luaer.cn/)Lua脚本语言,是一个便捷的,支持拓展和热更新的语言。
Lua使用C98标准编写,解释器仅仅几百kb,小的不可思议。
通过学习Lua的语法,对该语言的使用有基本的认识。
等熟练之后,尝试着阅读源码,可以学习到很多知识,毕竟这是工业级的源码。
可能会涉及到的议题:C与C指针,数据结构,设计模式,编译原理,操作系统等。Lua 数字只有double型64bits.
默认变量的类型是global型,局部变量前需要加上local关键字声明。Lua 的字符串支持单引号和双引号,还支持C类型的转义。
\a     bell
\b     back space
\f     form feed
\n     newline
\r     carriage return
\t     horizontal tab
\v     vertical tab
\\     backslash
\"     double quote
\'      single quoteC语言中的NULL在Lua中是nil,指的是未定义变量。
bool型只有nil和false是false,数字0和空字符('\0')都是true.任何期待一个number的地方,如果传入string,都是尝试将string转换为number。相反,在一个期待string的地方,如果传入number,那么也会尝试将number转换为string。当然也可以使用tostring和tonumber想换转换。
]]--print("Hello, Lua @\r\n2017.02.07")
print(type(3.14159e2))
print(type(print))
print(type(type))
print(type(type(123)))
print(type('Hello'))
print(type(nil))
print(type(true))
print(type(false))a = 'one string'                     --字符串是常量,不可更改
b = string.gsub(a,"one","another")  --创建新的string对象
print(a)
print(b)-- 关于number和string的操作
num = 10
str = "10"
print(tostring(num)==str)  --显式转换
print(num==tonumber(str))  --显式转换
print(10 .. 20)            -- ".."是Lua中的字符串连接符号,这里将number自动换为string
print("-5.3e-10"*"2")      --自动转换为数字
print("10"+1)              --自动转换为数字
print("10+1")              --字符串
print(#"hello")            --获取字符串长度 #-- 控制语句
print("while-do-end control flow")
sum,idx = 0, 0
while idx <= 100 dosum = sum + idxidx = idx + 1    --没有++或+=等重载操作符
end
print("sum of [1,2,...,100] is",sum)
print("sum of [1,2,...,100] is "..sum)-- if-else分支
print("if-then-elseif-then-else-end control flow")
sex = "Male"
print("Input age:")
age = tonumber(io.read())
if age <= 20 and sex =="Male" thenprint("努力吧,骚年!")
elseif age > 25 and sex ~="Female" thenprint("都成年了,还不奋斗!")
elseprint("You Lady!")
end-- for控制流
sum = 0
for i=100,1,-2 dosum = sum + i
end
print("sum of [100:-2:1] is",sum)-- repeat-until循环控制
sum = 2
repeatsum = sum ^2 -- 幂操作print(sum)
until sum > 1000-- 简单函数
function foo(x) return x^3  end
foo2 = function(x) return x^3 end
print(foo(2))
print(foo2(2))-- 递归函数
function fib(n)if n < 2 then return 1 endreturn fib(n-1)+fib(n-2)
end
print("fib(10)=",fib(10))-- 闭包1
function myPower(x)return function(y)local res = y^xreturn resend
endpower2 = myPower(2)
power3 = myPower(3)print(power2(4)) --4的2次方
print(power2(5)) --5的2次方
print(power3(4)) --4的3次方
print(power3(5)) --5的3次方-- 闭包2
function newCounter()local i = 0return function()     -- anonymous functioni = i + 1return iend
endcnt = newCounter()
print(cnt())  --> 1
print(cnt())  --> 2-- 赋值和返回值
function getUserInfo(id)print(id)local name,age,bGay,girlfriend = "jin",24,false,nilreturn  name,age,bGay,girlfriend
endname,age,bGay,girlfriend,other = getUserInfo() -->没有传入id,id是nil
print(name,age,bGay,girlfriend,other)          -->"jin",24,false,nil,nil-- Table是一个Key-Value键值数据结构,很像Python中的dict,C语言中的表驱动结构体,
-- C++中的map,Javascript中的Objectjincc = {name="Jincc", age=25, male=True}
jincc.name = nil
jincc.website = "http://coolshell.cn"
for k,v in pairs(jincc) doprint(k,v)
endjincc = {['name']="Jincc", ['age']=24, ['male']=True}
print(jincc['name'],jincc['age'],jincc['male'])arr = {10,20,30,40,50}
arr = {[1]=10, [2]=20, [3]=30, [4]=40, [5]=50}
arr = {"string", 100, "jincc", function() print("coolshell.cn") end}
for i=1,#arr doprint(arr[i])
end-- 遍历Table(全局变量_G也是一个Table)
for k,v in pairs(arr) doprint(k,v)
end-- MetaTable 和 MetaMethod
--[[
MetaTable和MetaMethod是Lua中的重要的语法,用来做一些类似于C++重载操作符式的功能。
Lua内置的MetaMethod有:
__add(a, b)                     对应表达式 a + b
__sub(a, b)                     对应表达式 a - b
__mul(a, b)                     对应表达式 a * b
__div(a, b)                     对应表达式 a / b
__mod(a, b)                     对应表达式 a % b
__pow(a, b)                     对应表达式 a ^ b
__unm(a)                        对应表达式 -a
__concat(a, b)                  对应表达式 a .. b
__len(a)                        对应表达式 #a
__eq(a, b)                      对应表达式 a == b
__lt(a, b)                      对应表达式 a < b
__le(a, b)                      对应表达式 a <= b
__index(a, b)                   对应表达式 a.b
__newindex(a, b, c)             对应表达式 a.b = c
__call(a, ...)                  对应表达式 a(...)]]---- 两个分数,想实现分数之间的加法操作,需要使用MetaTable和MetaMethod
fraction_a = {numerator = 4, denominator = 5}
fraction_b = {numerator = 3, denominator = 7}-- 定义MetaTable 的 MetaMethod
fraction_op = {}
function fraction_op.__add(f1,f2)ret = {}ret.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominatorret.denominator = f1.denominator * f2.denominatorreturn ret
end
-- 设置 metatable
setmetatable(fraction_a,fraction_op)
setmetatable(fraction_b,fraction_op)-- 调用metamethod,实际上调用的是 fraction_op._add()函数
fraction_s = fraction_a + fraction_bfunction print_fraction(f)print(f.numerator,f.denominator)return nil
end
print_fraction(fraction_a)
print_fraction(fraction_b)
print_fraction(fraction_s)-- 重载find key操作(也就是__index),组合对象,类似于JavaScript的prototype
Window_Prototype = {x=0,y=0,width=1280,height=768}
MyWin={title="Hello,Lua"}
setmetatable(MyWin,{__index=Window_Prototype})
for k,v in pairs(MyWin) doprint(k,v)
end-- Lua的面向对象
Person={}
function Person:new(p)local obj = pif(obj == nil) thenobj = {['name']="Jincc", ['age']=24, ['male']=True}endself.__index = selfreturn setmetatable(obj,self)
endfunction Person:toString()return "Person\nname: "..self['name'].."\nage:" .. self['age'].."\nmale:".. (self['male']  and "yes" or "no")
end--[[
Person有一个new方法和toString方法,其中:
1)self 就是 Person,Person:new(p),相当于Person.new(self, p)
2)new方法的self.__index = self 的意图是怕self被扩展后改写,所以,让其保持原样
3)setmetatable这个函数返回的是第一个参数的值。
]]--
-- 调用
me = Person:new()
print("===============\n",me:toString())
kf = Person:new{name="King's fucking", age=70, handsome=false}
print("===============\n",kf:toString())-- Person的继承。Lua和JavaScript很相似,都是在MetaTable或Prototype实例上进行修改
Student = Person:new()
function Student:new()newObj = {year = 2017}self.__index  =selfreturn setmetatable(newObj,self)
end
st = Student:new()
print("===============\n",st:toString())-- 修改toString()
function Student:toString()return "Student\nname: "..self['name'].."\nyear:"..self.year
end
st = Student:new()
print("===============\n",st:toString())

转载于:https://www.cnblogs.com/ausk/p/6374599.html

[2017.02.07] Lua入门学习记录相关推荐

  1. SSM框架入门学习记录

    SSM框架入门学习记录 //项目结构 在这里插入图片描述 在这里插入图片描述 包名多种多样,命名习惯问题. 流程:Controller(接受请求)-->Service(biz)(bl)(写业务函 ...

  2. jmeter入门学习记录

    jmeter入门学习记录 Jmeter 介绍 下载和运行 发送简单请求测试 第一步:建立Thread Group 第二步:新建一个 HTTP Request 第三步:添加HTTP Head Manag ...

  3. MOOSE多物理场耦合平台入门学习记录一(稳态热传导程序实例)

    MOOSE多物理场耦合平台入门学习记录 MOOSE的简介 MOOSE的安装 Linux和Mac Windows MOOSE程序的一般开发流程-以导热微分方程为例 简单问题的有限元处理 MOOSE程序的 ...

  4. lua菜鸟教程_初学者必看:Lua入门学习教程

    Lua入门学习教程是本文要介绍的内容,主要是来对Lua入门的一个学习,Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言.不幸的是,网上很少有关于这个语言的在线教程.我主要通过阅读其源代码来了 ...

  5. stm32f103c8t6c语言教程,STM32f103C8T6入门学习记录.doc

    STM32f103C8T6入门学习记录 STM32 自 学 笔 记 作者:忙碌的小姚 新浪微博:@忙碌的小姚 新浪博客: /mlxiaoyao222 目录 STM32 自 学 笔 记1 第一章3 我与 ...

  6. 黑马程序员 C++ 基础语法入门 学习记录

    基础语法入门 文章目录 一.初识C++ 1.1 新建项目 1.2 编写项目 1.3 运行程序 1.4 注释 1.5 变量 1.6 常量 1.7 关键字 1.8 标识符命名规则 二.数据类型 2.1 整 ...

  7. 界面设计02 - 零基础入门学习Delphi43

    界面设计02 让编程改变世界 Change the world by program MDI应用程序设计技术 与SDI应用程序相对应,MDI应用程序是允许在一个主窗体中创建多个子窗口的应用程序. 例如 ...

  8. pytorch初入门学习记录

    PyTorch第一步 1.Tensor from __future__ import print_function import torch as t # 构建 5x3 矩阵,只是分配了空间,未初始化 ...

  9. can总线配置读入是什么意思_Simulink(常量amp;总线amp;示波器模块)+嵌入式(AURIX入门学习记录CAN通信配置)...

    1 Simulink Simulink-常量&总线&示波器模块a.标量与矩阵的运算 在simulink中使用常量进行加减乘除计算时,系统会自动对标量进行拓展: 若将两个矩阵模块计算时维 ...

最新文章

  1. linux命令之修改系统允许进程打开文件描述符限制-ulimit
  2. Java程序员如何在5年内从小白晋升为高手?
  3. 银行理财不再保本保息,你还敢买吗?
  4. Django-model进阶
  5. linux mv命令改名,Linux mv命令:移动文件或改名
  6. git push 失败出现error: src refspec master does not match any.解决方案
  7. cocos3 动作回调函数
  8. Android Studio 自定义字体显示英文音标
  9. 游戏编程入门步骤,想不到吧.
  10. python排序算法——冒泡排序时间复杂度
  11. 51单片机八音盒C语言,单片机八音盒程序和与仿真原理图
  12. Django 3.2正式发布! 附中文文档链接地址!
  13. java从入门到放弃教程(一) 想转行的看过来
  14. 机械工程c语言第一学期考试题,科学出版社机械工程图学习题集1~10章答案.ppt
  15. 思科CCNP网络工程师 CCIE考试常见问题GRE虚拟专用网络详解
  16. Matplotlib绘制漫威英雄战力图,带你飞起来!
  17. sharepoint文件夹本地同步_DIY游戏云存档 - 单机游戏存档多机异地同步方案
  18. VFB直接使用TCP发送电子邮件源码
  19. 什么是二级域名?二级域名如何注册申请?
  20. ABAP ALV单元格最大显示长度

热门文章

  1. BZOJ3057 圣主的考验
  2. erlang监控树 supervisor
  3. Asp.net在线备份、压缩和修复Access数据库
  4. 第九节--绑定 -- Classes and Objects in PHP5 [9](转)
  5. 时隔两年,盘点ECCV 2018影响力最大的20篇论文
  6. Det3D - 首个通用 3D 目标检测框架
  7. 收藏 | 使用合成数据集做目标检测
  8. 一文详解计算机视觉五大技术:图像分类、对象检测、目标跟踪、语义分割和实例分割
  9. Python解决使用列表副本问题
  10. Bezier(贝塞尔)曲线(三阶)的轨迹规划在自动驾驶中的应用(四)