15分钟学会Lua

lua的很多语法跟matlab很像
最基本的赋值是一样的
循环和选择判断后面必须跟一个关键字:do和then
for i =1,1,100 do
...
end
ifthenend

 

table是lua的唯一一种数据结构,但是可以用它来构造数组、链表、字典等。
-- Dict literals have string keys by default:
t = {key1 ='value1', key2 =false}
-- String keys can use js-like dot notation:
print(t.key1)-- Prints 'value1'.
增加新的key
t.newKey = {}-- Adds a new key/value pair.
t.key2 =nil-- Removes key2 from the table.

可以用任何数据作为key。但是一般如果用table作为key的话,它是通过严格判断两个table是否相同,有时候会查不到你想要的key

 
for key,val in pairs(table) do
print(key,val)
end
_G 是一个特殊的table,它里面存储所有的全局变量
#v表示v这个list的数量
 
-- 默认以字符串作为 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 一样 {} 会创建新的对象
          -- 因此不要用蛋疼的 key 值,老老实实用字串或数字
 

 

----------
-  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 + y.b
  return sum
end
 
setmetatable(f1, mm)
setmetatable(f2, mm)
 
-- 实际调用 f1 的 metatable 中的 __add(f1, f2)
-- 只为 f1 设置元表也可以
s = f1 + f2 -- s = {a = 3, b = 5}
 
-- s2 = s + s 为错,s 未定义元表
 
-- __index 元方法重载表中 key 的提取符号 `.`
defaultFavs = {animal = 'gru', food = 'donuts'}
myFavs = {food = 'pizza'}
setmetatable(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)  <fn or a table>  for a.b
-- __newindex(a, b, c)             for a.b = c
-- __call(a, ...)                  for a(...)
----------
- 类风格的 Table 与继承
----------
 
-- 像 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"

 

 
----------
- 4. 模块
----------
 
-- 以下来自文件 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') -- 运行 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!"

 

 
posted @ 2016-10-26 10:55  kevinTien  阅读(1120)  评论(0编辑  收藏  举报