--单行注释
--[[
[多行注释]
--]]
-1.变量&控制量
----------
num=23 --数字都是双精度
str='aspythonstring'--像Phython一样不可变
str="aspythonuse"--可以双引号
str=[[
像Phython的多行注释可用于
表示多行字符串一样
方便
]]
bol=nil--未定义;支持垃圾回收
--缩进只为易读性,像Matlab一样以end结尾
while num<50 do
num=num+1--没有++或者+=自增操作符号
end
-- IF条件开关
if num>40 then
print('>40')
elseif s~='aspython' then --~=表示!=
io.write('s is not aspython')--风骚的标准输出
else
thisIsGloal=5--驼峰式命名
--显示声明局部变量(像javascript一样)
local line=io.read()
--..作为字符串连接符
print('凛冬将至'..line)
end
--引用未定义的变量将返回nil,这不是错误
foo=anUnknownVariable--等价于foo=nil
aBoolValue=false
--只有nil与false为假:数字0与空字串‘’为真!
if not aBoolValue then print('false') end
--像Python一样运用'or'和'and'
--得到C语言a?b:c的效果;需要b=false或nil的情况
ans=aBoolValue and 'yes'or'no'
karLSum=0
for i=1,100 do--像Matlab一样的递增语法,包含两端,如[1,100]
karLSum=karLSum+i
end
--Step为2递减的方式'100,1,-2'
for j=100,1,-2 then print(j)end
--综上,范围可表示为“begin,end[,Step]”
--另一个循环控制
num=23
repeat
print('凡人必有一死')
num=num-1
until num=0
-2.函数
--------------
--递归
function fib(n)
if n<2then return 1 end
return fib(n-2)+fib(n-1)
end
a1=adder(9)
a2=adder(36)
print(a1(16))-->25
print(a2(64))-->100
--遇到不匹配的列表长度时
--过长的变量将被赋予nil
--过长的值将被忽略
x,y,z=1,2,3,4-->4将被忽略
function bar(a,b,c)
print(a,b,c)
return 4,8,15,16,23,42
end
x,y=bar('zaphod')
--x=4,y=8,其余值被忽略
--函数与其他类型一样为一等公民
--同样有Local/global之分
--像javascript一样定义
function f(x) return x*x end
f=function(x) return x*x end
print 'Hello World'--只有一个‘字符'参数时可以省略括号?
--------------
-3.表(Table)
--表示lua中唯一的复合类型
--像PHP中的数组或Javascript中的Object一样
--可用作list/dict/map
--默认以字符串作为Key
t={key1='value1',key2=false}
-像javascript一样以.取值
print(t.key1)-->"value1"
t.key3={}--加入新的键值对增
t.key2=nil --销毁一组键值对?
--理论上任何非nil的变量都可以作为key
u={['@!#']='qbert',[{}]=1729,[6.28]='tau'}
print(u[6.28])-->"tau"
a=u['@!#']--a='qbert'
b=u[{}]--b=nil;像javascript一样{}会创建新的对象
--因此不要
--同字符串一样,只有一个表作为函数参数时可以省略号?
--为了一个括号增加阅读难度,得不偿失
function h(x) print(x.key1) end
h{key1='Sommi~451'}-->"Sonmi~451"
for key,val in paris(u) do --像Python一样的迭代
print(key,val)
end
--像javascript一样的全局作用域
_G
print(_G['_G']==_G)-->true
--省略key之后即可变身为list
--实际上是以递增自然数为key
v={'value1','value2',1.21,'gigawatts'}
for i=1,#v do
print(v[i])
end
--------
-3.1 Metatables & Metamethods
----------
--元表(Metatable>就是表的表,像javascript的原型(prototype)一样
--为表重载一些元方法(Metamethods?
f1={a=1,b=2}
f2={a=2,b=3}
--s=f1+f2为错
mm={}
function mm.__add(x,y)
sum={}
sum.a=x.a+y.a
sum.b=x.b+x.b
return sum
end
setmeatable(f1,mm)
setmeatable(f2,mm)
--实际调用f1的metatable中的metatable中的__add(f1,f2)
--只为f1设置元表也可以
s=f1+f2--s={a=3,b=5}
--s2=s+s 为错,s未定义元表
--__index元方法重载表中key的提取符号'.'
--相当于继承的实现,在当前的table找不到值时,就会去找他继承的方法
defaultFavs={animal='gru',food='donuts'}
myFavs={food='pizza'}
setmeatable(myFavs,{__index=defaultFavs})
food=myFavs.food
--Lua中的值都具有原方法,只有Table可以重载
--所有元方法如下
--__add(a,b) for a+b
--__sub(a,b) for a-b
--__mul(a,b) for a*b
--__div(a,b) for a/b
--__mod(a,b) for a%b
--__pow(a,b) for a^b
--__unm(a) for -a
--__concat(a,b) for a..b
--__Len(a) for #a
--__eq(a,b) for a==b
--__lt(a,b) for a<b
--__le(a,b) for a<=b
--__index(a,b) for a.b
--__newindex(a,b,c) for a.b=C语言a
--__call(a,....) for a(...)
------
-3.2 类风格的Table与继承
------
Dog={} --1
function Dog:new() --2
newObj={sound='woof'} --3
self.__index=self --4
return setmeatable(newObj,self) --5
end
function Dog:makeSound() --6
print('I say'self.sound)
end
mrDog=Dog:new() --7
mrDog:makeSound()-->"I say wwoof"
--1.Dog像类但实际上是Table
--2.Dog:new(...):=Dog.new(self,..)
--3.newObj作Dog的实例
--4.self是Lua中默认的参数,在这里self=Dog
--继承的时候可以改变
--self.__index与self的元方法__index不是一回事
--self={__index=self,metatable={__index=...}}
--5.setmeatable(newObj,self)相当于setatable(newObj,{__index=self})
--赋予实例所有类方法
--6.同2.
--mrDog=Dog=Dog.new(Dog)
--4
-------
--以下来自文件mod.lua
local M={}
local function sayMyName()
print('Hrunkner')
end
function M.sayHello()
print('Why Hello there')
sayMyName()--给这个方法再加一个方法(个人理解)
end
return M
--以上
--回到主文件mod
local mod=require('mod')--运行mod.lua中的代码
--操作同下
local mod=(function()
--像javascript一样
--[[
mod.lua中的代码
]]--
end
)()
mod.sayHello()-->"Why Hello there"
mod.sayMyName()-->错!sayMyName()是mod.lua中的局部变量
--require 返回的值将被缓存
--即使多次调用require被调用文件也只运行一次
--mod2.lua包含print("mod2")
local a=require("mod2")-->"mod2"
local b=require("mod2")--不输出,实际为b=a
--dofile 是不缓存的版本的require
dofile("mod2")-->"mod2"
dofile("mod2")-->"mod2"
--loadfile 读取文件但不执行
--勘误:f=loadfile('mod2'),需要加后缀名,否则找不到文件
f=loadfile('mod2.lua')
f()-->"mod2"
--Loadstring 读取代码字符串
f=loadstring("print('lua is cool!')")
f()-->"Lua is cool"
--[[
[多行注释]
--]]
-1.变量&控制量
----------
num=23 --数字都是双精度
str='aspythonstring'--像Phython一样不可变
str="aspythonuse"--可以双引号
str=[[
像Phython的多行注释可用于
表示多行字符串一样
方便
]]
bol=nil--未定义;支持垃圾回收
--缩进只为易读性,像Matlab一样以end结尾
while num<50 do
num=num+1--没有++或者+=自增操作符号
end
-- IF条件开关
if num>40 then
print('>40')
elseif s~='aspython' then --~=表示!=
io.write('s is not aspython')--风骚的标准输出
else
thisIsGloal=5--驼峰式命名
--显示声明局部变量(像javascript一样)
local line=io.read()
--..作为字符串连接符
print('凛冬将至'..line)
end
--引用未定义的变量将返回nil,这不是错误
foo=anUnknownVariable--等价于foo=nil
aBoolValue=false
--只有nil与false为假:数字0与空字串‘’为真!
if not aBoolValue then print('false') end
--像Python一样运用'or'和'and'
--得到C语言a?b:c的效果;需要b=false或nil的情况
ans=aBoolValue and 'yes'or'no'
karLSum=0
for i=1,100 do--像Matlab一样的递增语法,包含两端,如[1,100]
karLSum=karLSum+i
end
--Step为2递减的方式'100,1,-2'
for j=100,1,-2 then print(j)end
--综上,范围可表示为“begin,end[,Step]”
--另一个循环控制
num=23
repeat
print('凡人必有一死')
num=num-1
until num=0
-2.函数
--------------
--递归
function fib(n)
if n<2then return 1 end
return fib(n-2)+fib(n-1)
end
a1=adder(9)
a2=adder(36)
print(a1(16))-->25
print(a2(64))-->100
--遇到不匹配的列表长度时
--过长的变量将被赋予nil
--过长的值将被忽略
x,y,z=1,2,3,4-->4将被忽略
function bar(a,b,c)
print(a,b,c)
return 4,8,15,16,23,42
end
x,y=bar('zaphod')
--x=4,y=8,其余值被忽略
--函数与其他类型一样为一等公民
--同样有Local/global之分
--像javascript一样定义
function f(x) return x*x end
f=function(x) return x*x end
print 'Hello World'--只有一个‘字符'参数时可以省略括号?
--------------
-3.表(Table)
--表示lua中唯一的复合类型
--像PHP中的数组或Javascript中的Object一样
--可用作list/dict/map
--默认以字符串作为Key
t={key1='value1',key2=false}
-像javascript一样以.取值
print(t.key1)-->"value1"
t.key3={}--加入新的键值对增
t.key2=nil --销毁一组键值对?
--理论上任何非nil的变量都可以作为key
u={['@!#']='qbert',[{}]=1729,[6.28]='tau'}
print(u[6.28])-->"tau"
a=u['@!#']--a='qbert'
b=u[{}]--b=nil;像javascript一样{}会创建新的对象
--因此不要
--同字符串一样,只有一个表作为函数参数时可以省略号?
--为了一个括号增加阅读难度,得不偿失
function h(x) print(x.key1) end
h{key1='Sommi~451'}-->"Sonmi~451"
for key,val in paris(u) do --像Python一样的迭代
print(key,val)
end
--像javascript一样的全局作用域
_G
print(_G['_G']==_G)-->true
--省略key之后即可变身为list
--实际上是以递增自然数为key
v={'value1','value2',1.21,'gigawatts'}
for i=1,#v do
print(v[i])
end
--------
-3.1 Metatables & Metamethods
----------
--元表(Metatable>就是表的表,像javascript的原型(prototype)一样
--为表重载一些元方法(Metamethods?
f1={a=1,b=2}
f2={a=2,b=3}
--s=f1+f2为错
mm={}
function mm.__add(x,y)
sum={}
sum.a=x.a+y.a
sum.b=x.b+x.b
return sum
end
setmeatable(f1,mm)
setmeatable(f2,mm)
--实际调用f1的metatable中的metatable中的__add(f1,f2)
--只为f1设置元表也可以
s=f1+f2--s={a=3,b=5}
--s2=s+s 为错,s未定义元表
--__index元方法重载表中key的提取符号'.'
--相当于继承的实现,在当前的table找不到值时,就会去找他继承的方法
defaultFavs={animal='gru',food='donuts'}
myFavs={food='pizza'}
setmeatable(myFavs,{__index=defaultFavs})
food=myFavs.food
--Lua中的值都具有原方法,只有Table可以重载
--所有元方法如下
--__add(a,b) for a+b
--__sub(a,b) for a-b
--__mul(a,b) for a*b
--__div(a,b) for a/b
--__mod(a,b) for a%b
--__pow(a,b) for a^b
--__unm(a) for -a
--__concat(a,b) for a..b
--__Len(a) for #a
--__eq(a,b) for a==b
--__lt(a,b) for a<b
--__le(a,b) for a<=b
--__index(a,b) for a.b
--__newindex(a,b,c) for a.b=C语言a
--__call(a,....) for a(...)
------
-3.2 类风格的Table与继承
------
Dog={} --1
function Dog:new() --2
newObj={sound='woof'} --3
self.__index=self --4
return setmeatable(newObj,self) --5
end
function Dog:makeSound() --6
print('I say'self.sound)
end
mrDog=Dog:new() --7
mrDog:makeSound()-->"I say wwoof"
--1.Dog像类但实际上是Table
--2.Dog:new(...):=Dog.new(self,..)
--3.newObj作Dog的实例
--4.self是Lua中默认的参数,在这里self=Dog
--继承的时候可以改变
--self.__index与self的元方法__index不是一回事
--self={__index=self,metatable={__index=...}}
--5.setmeatable(newObj,self)相当于setatable(newObj,{__index=self})
--赋予实例所有类方法
--6.同2.
--mrDog=Dog=Dog.new(Dog)
--4
-------
--以下来自文件mod.lua
local M={}
local function sayMyName()
print('Hrunkner')
end
function M.sayHello()
print('Why Hello there')
sayMyName()--给这个方法再加一个方法(个人理解)
end
return M
--以上
--回到主文件mod
local mod=require('mod')--运行mod.lua中的代码
--操作同下
local mod=(function()
--像javascript一样
--[[
mod.lua中的代码
]]--
end
)()
mod.sayHello()-->"Why Hello there"
mod.sayMyName()-->错!sayMyName()是mod.lua中的局部变量
--require 返回的值将被缓存
--即使多次调用require被调用文件也只运行一次
--mod2.lua包含print("mod2")
local a=require("mod2")-->"mod2"
local b=require("mod2")--不输出,实际为b=a
--dofile 是不缓存的版本的require
dofile("mod2")-->"mod2"
dofile("mod2")-->"mod2"
--loadfile 读取文件但不执行
--勘误:f=loadfile('mod2'),需要加后缀名,否则找不到文件
f=loadfile('mod2.lua')
f()-->"mod2"
--Loadstring 读取代码字符串
f=loadstring("print('lua is cool!')")
f()-->"Lua is cool"