原文:http://blog.jobbole.com/70480/
--[[--变量 & 控制流
local num = 1while num < 5 do
num = num + 1
print (num)
end
function show()
if num < 5 then
print (num)
elseif num == 5 then
io.write('num is 5\n')
else
local line = io.read()
print('how to be a great people? ' .. line)
end
end
show()
foo = anUnknownVariable
if foo == nil then
io.write('foo is nil\n')
end
aBoolValue = false
if 0 then print('false\n')end
ans = aBoolValue and 'yes' or 'no'
print(ans)
karlSum = 0
for i= 1,5 do
karlSum = karlSum + 1
print(karlSum)
end
for j=10,1,-2 do print(j) end
num = 3
repeat
print('凡人必有一死')
num = num -1
until num == 0
--]]
--[[--函数
function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n-1)
end
fib3 = fib(3)
print(fib3)
function adder(x)
-- 返回一个函数
-- 闭包内封存 x 值
return function (y) return x + y end
end
a1 = adder(9)
a2 = adder(36)
print(a1(16)) --> 25
print(a2(64)) --> 100
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')
print(x) print(y)
--function f(x) return x * x end
f = function (x) return x * x end
print(f(5))
print 'Hello World!'
--]]
--[[Metatables & metamethods
--表
t = {key1 = 'value1', key2 = false}
-- 像 Javascript 一样以 . 取值
print(t.key1)
t.key3 = {}
t.key2 = nil
print(t.key2)
print(t.key3)
u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'}
print(u[6.28])
a = u['@!#'] print (a)
b = u[{}] print(b)
function h( x )
print(x.key1)
end
c = h{key1 = 'sonmi'}
for key, val in pairs(u) do -- 像 Python 一样的键值迭代
print(key, val)
end
print(_G['_G'] == _G)
v = {'value1', 'value2', 1.21, 'gigawatts'}
for i = 1, #v do --像Base一样,#v 表示列表长度
print(v[i])
end
f1 = {a = 1, b = 2}
f2 = {a = 2, b = 3}
mm = {}
function mm.__add( x,y )
sum = {}
sum.a = x.a + y.a print(sum.a)
sum.b = x.b + y.b print(sum.b)
return sum
end
setmetatable(f1, mm)
setmetatable(f2, mm)
s = f1 + f2
-- __index 元方法重载表中 key 的提取符号 `.`
defaultFavs = {animal = 'gru', food = 'donuts'}
--myFavs = {food = 'pizza'}
myFavs={}
setmetatable(myFavs, {__index = defaultFavs})
food = myFavs.food
print(food)
-- 像 Javascript 一样并没有内置 Class
-- 但可以通过 Table `{}` 实现
Dog = {} -- 1.
function Dog:new() -- 2.
newObj = {sound = 'woof'} -- 3.
self.__index = self -- 4.
return setmetatable(newObj, self) -- 5.
end
function Dog:makeSound() -- 6.
print('I say ' .. self.sound)
end
mrDog = Dog:new() -- 7.
mrDog:makeSound() --> "I say woof"
-- 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. setmetatable(newObj, self) 相当于 setmetatable(newObj, {__index = self})
-- 赋予实例所有类方法
-- 6. 同 2.
-- 7. mrDog = Dog.new(Dog)
-- 继承
LoudDog = Dog:new()
function LoudDog:makeSound()
s = self.sound .. ' '
print(s .. s .. s)
end
seymour = LoudDog:new()
LoudDog:makeSound() --> "woof woof woof"
--]]
--[[
local mod1 = require('mod')
local mod = (function()
local M = {}
local function sayMyName()
print('Hrunkner')
end
function M.sayHello()
print('Why hello there')
sayMyName()
end
return M
end)()
mod.sayHello() --> "Why hello there"
--local a = require("mod2") --> "mod2"
--local b = require("mod2") -- 不输出, 实际为 b = a
--dofile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua") --> "mod2"
--dofile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua") --> "mod2"
f = loadfile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua")
f() --> "mod2"
]]
f = load("print('test')")();
f()