lua基础
一、注释
单行注释:两个破折号
多行注释:[[ … ]]
二、变量和流程控制
所有的数字类型都是double
num=42
字符串是Immutable的,和python一样
s = 'walternate'
t = "double-quotes are also fine"
u = [[ Double brackets
start and end
multi-line strings.]]
lua有垃圾回收机制,t是undefined
t = nil
语句块用关键字do/end标示
while num < 50 do
num = num + 1
end
If 语句:
if num > 40 then
print('over 40')
elseif s ~= 'walternate' then
io.write('not over 40\n')
else
thisIsGlobal = 5
local line = io.read()
print('Winter is coming, ' .. line)
end
未定义的变量返回nil
foo = anUnknownVariable
aBoolValue = false
if not aBoolValue then print('twas false') end
-- 'or' and 'and' 是短路的.
ans = aBoolValue and 'yes' or 'no'
karlSum = 0
for i = 1, 100 do
karlSum = karlSum + i
end
-- 用 "100, 1, -1" 作为区间来递减:
fredSum = 0
for j = 100, 1, -1 do fredSum = fredSum + j end
-- 总体上, 区间是 begin, end[, step].
repeat
print('the way of the future')
num = num - 1
until num == 0
三、函数
function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n - 1)
end
function adder(x)
return function (y) return x + y end
end
a1 = adder(9)
a2 = adder(36)
print(a1(16))
print(a2(64))
x, y, z = 1, 2, 3, 4
function bar(a, b, c)
print(a, b, c)
return 4, 8, 15, 16, 23, 42
end
x, y = bar('zaphod')
function f(x) return x * x end
f = function (x) return x * x end
local function g(x) return math.sin(x) end
local g; g = function (x) return math.sin(x) end
print 'hello'
四、表
Tables : 哈希查找的关联数组,和dictionaries、map类似,是lua仅有的复合数据结构。
Dict的的键默认是字符串的
t = {key1 = 'value1', key2 = false}
print(t.key1)
t.newKey = {}
t.key2 = nil
表常用的的键一般是数字或者字符串
u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'}
print(u[6.28])
a = u['@!#']
b = u[{}]
for key, val in pairs(u) do
print(key, val)
end
function h(x) print(x.key1) end
h{key1 = 'Sonmi~451'}
print(_G['_G'] == _G)
v = {'value1', 'value2', 1.21, 'gigawatts'}
for i = 1, #v do
print(v[i])
end
4.1. 元表和元方法.
–元表给予表操作符重载的特性,类似js的prototype的特性。
f1 = {a = 1, b = 2}
f2 = {a = 2, b = 3}
metafraction = {}
function metafraction.__add(f1, f2)
sum = {}
sum.b = f1.b * f2.b
sum.a = f1.a * f2.b + f2.a * f1.b
return sum
end
setmetatable(f1, metafraction)
setmetatable(f2, metafraction)
s = f1 + f2
defaultFavs = {animal = 'gru', food = 'donuts'}
myFavs = {food = 'pizza'}
setmetatable(myFavs, {__index = defaultFavs})
eatenBy = myFavs.animal
一个__index值也可以是个函数(tbl, key),有利于个性化查找。
像__index,add, .. 都是元方法,下面是一个全表,这里 a是一个有metamethod的表
4.2. 类风格的表与继承
类不是内置的,有多种可以使用tables和metatables的方法
Dog = {}
function Dog:new()
newObj = {sound = 'woof'}
self.__index = self
return setmetatable(newObj, self)
end
function Dog:makeSound()
print('I say ' .. self.sound)
end
mrDog = Dog:new()
mrDog:makeSound()
–1. Dog 像是一个class,它实际是一个表。
–2. 函数 tablename:fn(…) 和函数tablename.fn(self,…)一样,: 仅仅添加第一个名为self的参数。
–3. newObj是类Dog的实例。
–4. self就是被继承的类,但是继承可以改变self的值,这里是Dog,当我们设置newObj’s metatable 和 self’s __index to self时,newObj 才能使用self’s 函数。
–5. setmetatable 返回它的第一个参数
–6. 这时,self是一个实例而不是一个类。
–7. 和Dog.new(Dog)一样。
–8. 和mrDog.makeSound(mrDog)一样; 此时 self = mrDog.
继承的例子:
LoudDog = Dog:new()
function LoudDog:makeSound()
s = self.sound .. ' '
print(s .. s .. s)
end
seymour = LoudDog:new()
seymour:makeSound()
– 1. LoudDog 继承了 Dog’s 的方法和变量。
– 2. self 有一个来自于new()的 ‘sound’键。
– 3. 和LoudDog.new(LoudDog)一样, 由于LoudDog没有‘new’键,将被转换为 Dog.new(LoudDog),但是它的 metatable 拥有 index = Dog。
结论:seymour的 metatable是LoudDog,LoudDog.index = LoudDog. 所以 seymour.key = seymour.key, LoudDog.key, Dog.key, 任何第一个含有给定键的表。
– 4. ‘makeSound’ key 包含在LoudDog;这和LoudDog.makeSound(seymour)一样.
– 如果有需要, 一个子类的 new() 可以和基类的一样:
function LoudDog:new()
newObj = {}
-- set up newObj
self.__index = self
return setmetatable(newObj, self)
end
五、模块
– 假设文件mod.lua 像如下所示:
local M = {}
local function sayMyName()
print('Hrunkner')
end
function M.sayHello()
print('Why hello there')
sayMyName()
end
return M
local mod = require('mod')
local mod = (function ()
<contents of mod.lua>
end)()
mod.sayHello()
mod.sayMyName()
local a = require('mod2')
local b = require('mod2')
dofile('mod2.lua')
dofile('mod2.lua')
f = loadfile('mod2.lua')
g = loadstring('print(343)')
g()
参考:
15分钟学会lua
Lua编程(Part 1):基本语法
Lua编程(Part 2):数据和标准库
Lua编程(Part 3):高级概念
Lua编程(Part 4):技巧
love 2D游戏引擎
lua官方学习文档
A quick tour of Torch internals
基于Torch的LSTM实现