`

lua 语法汇总

 
阅读更多
--
-- Created by IntelliJ IDEA.
-- User: koko
-- Date: 15/5/21
-- Time: 下午8:48
-- To change this template use File | Settings | File Templates.
--

-- lua的基本数据类型

-- lua的优势,1 可扩展性,可以很很多语言集成   2 简单,类似js
--           3  高效率(这个时我们采用他的主要原因) 4 与平台无关


-- lua的几种使用方式
--循环遍历   1 嵌入到应用程序中(我们也是应用在这个方面,和nginx结合,加速页面渲染)
--          2作为一种独立的语言
--          3作为库供第三方调用

--  lua 官方网站 lua官网  http://www.lua.org

-- 本章介绍

-- lua注释
-- 单行注释
-- [[ ]] 多行注释


--  最简单的lua demo
--  print("a")  --  保存为hello.lua
--  运行lua  hello.lua即可


--  全局变量和局部变量
 --[[ local partVarible=1;
  globalVarible =1;]]

-- loadfile 可以将代码加载 ,优点类似jsp里的include

--  lua的几种基本数据类型 Nil,Boolean,Number,String,Function, Userdata and Threads

-- 算数运算符 < > <= >= == ~=(和!=意思一样)
-- 逻辑运算符  and or not
-- 字符串链接运算符 ..
-- 优先级
--[[

^
not - (unary)
*/
+-
..
< > <= >= ~= == and
or

]]


-- 表的构造
--[[days = {"Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday"}]]


-- 赋值语句

--[[a = "hello" .. "world"
t.n = t.n + 1
a, b = 10, 20]]

-- 他里面的交换算法非常简单

--[[x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]
]]

-- 控制语句
--[[if conditions then
    then-part
    end;]]
--[[while condition do
    statements;
end;]]


--[[repeat
    statements;
until conditions;]]

--[[for var=exp1,exp2,exp3 do
    loop-part
    end]]

--for i,v in ipairs(a) do print(v) end

--for k in pairs(t) do print(k) end

--[[
local a = {5,8,9,10};

for key,value  in pairs(a)
    do print(key,value);
end]]

-- 函数多返回值

-- local a ,b = fun();





-- 闭包 ,grades 成为upvalue
--[[
names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
table.sort(names, function (n1, n2)
        return grades[n1] > grades[n2] -- compare the grades
    end
)

for key,value  in pairs(names)
    do print(key,value);
end
]]

--查看是否支持动态链接库
--print(loadlib());




--[[if pcall(openfile)
    then
    print("ok")

    end]]
--[[
local status, err = pcall(
    function ()
        error({code=121},2)
    end);
print(err.code)]]


--[[
co = coroutine.create(function ()
    for i=1,10 do
        print("co", i)

        coroutine.yield()
    end
end)

coroutine.resume(co) --> co 1
 print(coroutine.status(co))]]

--[[

local authors = {} -- a set to collect authors
function Entry (b)
    authors[b.author] = true
end
dofile("entry.lua")
for name in pairs(authors)
    do print(name)
end
]]

-- 定义metatable
--[[t={}
t1 = {}
setmetatable(t, t1)
assert(getmetatable(t) == t1)]]

-- metatable和metamethods 实例

--[[Set = {}
function Set.new (t)
local set = {}
setmetatable(set, Set.mt)
for _, l in ipairs(t) do set[l] = true end
return set
end
function Set.union (a,b)
    local res = Set.new{}
    for k in pairs(a) do res[k] = true end
    for k in pairs(b) do res[k] = true end
    return res
end
function Set.intersection (a,b)
    local res = Set.new{}
    for k in pairs(a) do
        res[k] = b[k]
    end
    return res
end

function Set.tostring (set)
    local s = "{"
    local sep = ""
    for e in pairs(set) do
        s = s .. sep .. e
        sep = ", " end
    return s .. "}"
end
function Set.print (s)
    print(Set.tostring(s))
end

Set.mt = {}    -- metatable for sets


s1 = Set.new({10, 20, 30, 50})
s2 = Set.new{30, 1}
print(getmetatable(s1))     --> table: 00672B60
print(getmetatable(s2))


Set.mt.__add = Set.union


s3 = s1 + s2
Set.print(s3) --> {1, 10, 20, 30, 50}



Set.mt.__mul = Set.intersection


Set.print((s1 + s2)*s1)     --> {10, 20, 30, 50}]]

--  __add ,__mul,__eq,__lt,__le __tostring(print打印的时候调用)这些metamethods都可以被重写


--  The __index Metamethod 特殊的metamethod

--[[-- create a namespace
Window = {}
-- create the prototype with default values
Window.prototype = {x=0, y=0, width=100, height=100 }
-- create a metatable
Window.mt = {}
-- declare the constructor function
function Window.new (o)
    setmetatable(o, Window.mt)
    return o
end
Window.mt.__index = function (table, key)
    return Window.prototype[key]
end

w = Window.new{x=10, y=20}
w2 = Window.new{x=1111, y=2222 }
print(w.x)       --> 10
print(w2.x)       --> 10
print(Window.prototype.x)

--Window.mt.__index 没有必要是非得是函数,可以是一个表
-- 可以用如下形式
Window.mt.__index =Window.prototype;]]

--当我们想不通过调用__index metamethod 来访问一个表,我们可以使用 rawget 函数。 Rawget(t,i)的调用以 raw access 方式访问表。
--这样查找的时候不会访问_index

-- The __newindex Metamethod 用来对表进行访问
--[[
t = {} -- original table (created somewhere)
-- keep a private access to original table

local _t = t
-- create proxy
t = {}
-- create metatable
local mt = {
    __index = function (t,k)
        print("*access to element " .. tostring(k))
        return _t[k]  -- access the original table
    end,
    __newindex = function (t,k,v)
        print("*update of element " .. tostring(k) ..
                " to " .. tostring(v))
        _t[k] = v     -- update original table
    end
}
setmetatable(t, mt)

t[2] = 'hello'
print(t[2])]]


-- 打印全局变量

--[[for n in pairs(_G)
    do print(n)
end]]



-- loadstring 5.3版以后已抛弃
--a  = "123";
--loadstring("value =" .. a);



-- 使用动态名字访问全局变量
-- string 库的 gfind 函数来迭代 f 中的所有单词(单词指一个或多个子母下划 线的序列)
--[[
function getfield (f)
    local v = _G
    for w in string.gfind(f, "[%w_]+") do
        v = v[w]
    end
    return v
end


function setfield (f, v)
    local t = _G         -- start with the table of globals
    for w, d in string.gfind(f, "([%w_]+)(.?)") do
        if d == "." then -- not last field?
        t[w] = t[w] or {}
        t = t[w]
        else
            t[w] = v
            -- create table if absent
            -- get the table
            -- last field
            -- do the assignment
        end end
end

setfield("t.x.y", 10)
print(t.x.y)                --> 10
print(getfield("t.x.y"))    --> 10]]



-- 非全局环境
--[[a = 1 -- create a global variable
-- change current environment to a new empty table
setfenv(1, {})
print(a)    -- stdin:5: attempt to call global `print' (a nil value)]]


--[[
a = 1 -- create a global variable -- change current environment
setfenv(1, {_G = _G})
_G.print(a) --> nil
_G.print(_G.a) --> 1]]


-- (你必须在单独的 chunk 内运行这段代码,如果你在交互模式逐行运行他,
--  每一行 都是一个不同的函数,调用 setfenv 只会影响他自己的那一行。)
--  一旦你改变了你的环境, 所有全局访问都使用这个新的表,如果她为空,你就丢失所有你的全局变量,
--  甚至_G, 所以,你应该首先使用一些有用的值封装(populate)她,比如老的环境:
--[[a=1
local newgt = {} -- create new environment
setmetatable(newgt, {__index = _G})
setfenv(1, newgt) -- set it
print(a) --> 1]]


-- 当你访问"global" _G,他的值为旧的环境,其中你可以使用 print 函数。 你也可以使用继承封装(populate)你的新的环境:
--[[
a=1
local newgt = {} -- create new environment
setmetatable(newgt, {__index = _G}) setfenv(1, newgt) -- set it
print(a) --> 1

a = 10
print(a)    --> 10
print(_G.a)   --> 1
_G.a = 20
print(_G.a)  --> 20

]]




分享到:
评论

相关推荐

    lua语法 lua学习新手 基础 经典

    Lua 语法基础知识点总结 Lua 语言是一种轻量级、灵活的脚本语言,语法简单易学,但功能强大。下面是 Lua 语法的基础知识点总结: 注释 * 单行注释:使用 "--" 符号,注释从该符号到行末。 * 多行注释:使用 "--...

    lua语法说明.doc

    ### Lua语法说明 #### 一、引言 Lua是一门高效、轻量级的脚本语言,自2009年起其使用率显著上升。它不仅适用于游戏开发领域,也被广泛应用于Web应用、自动化脚本等多个场景。本文将对Lua的基础语法进行详细解读,...

    Lua UnPack函数用法实例

    总结来说,Lua中的unpack函数是一个简单但功能强大的工具,它允许程序员从数组类型的table中提取元素,并且可以根据需要从任意位置开始解包。在处理大量数据或者需要从数组中提取多个值的场景中,unpack函数可以显著...

    Lua脚本语法详细说明

    总结,Lua脚本语法简洁而强大,适合初学者快速上手。通过实例和练习,你可以更好地理解和掌握这些概念,并利用Lua解决实际问题。在Lua_Study这个压缩包中,你应该能找到更多有关Lua的学习资源,包括示例代码和习题,...

    lua程序设计及lua中文手册

    二、Lua语法特点 1. 易读性:Lua的语法简洁明了,没有复杂的语法规则,使得代码可读性强。 2. 动态性:Lua的所有数据类型都是动态的,这使得编程更加灵活。 3. 轻量级:Lua的运行库小,启动速度快,适合嵌入到...

    lua 5.2 中GOTO语句的使用

    在 Lua 5.2 中,`GOTO` 语句的基本语法如下: ```lua goto label; -- 语句 ::label:: -- 语句; ``` 这里 `label` 是一个标识符,用于标记目标位置。`goto` 后面紧跟的是目标位置的标签名称。 #### 三、使用说明 ...

    luaqt插件linux环境运行LuaQt

    它使得开发过程更为敏捷,因为 Lua 语法简洁,学习曲线平缓,同时也提供了与 C++ 代码的深度集成。 2. **Linux环境**: 在 Linux 上运行 LuaQt 需要确保已安装了 Lua 解释器、Qt 库以及 LuaQt 库本身。通常,你...

    lua-pb解析

    总结来说,“lua-pb解析”是指使用Lua语言和特定的lua-pb库解析protobuf格式的数据,它涉及protobuf的编译、Lua的脚本操作以及数据的序列化和反序列化过程。lua-pb项目提供了一个纯Lua环境下的解决方案,使得在不...

    LUA实现led闪烁.rar_JW4_lua_lua 点亮led_stm32 lua_stm32_lua

    总结来说,通过LUA在STM32平台上实现LED闪烁,我们可以利用其简洁的语法和强大的控制能力,同时得益于JW4等固件框架的支持,实现高效的嵌入式编程。这不仅简化了开发过程,还提高了代码的可读性和可维护性。

    Lua经典教程,附Lua环境 lua for windows

    总结,Lua是一种功能强大且易于学习的脚本语言,尤其适合嵌入式开发和游戏编程。通过“lua for windows”,你可以在Windows环境下轻松地学习和使用Lua,开启你的编程之旅。在实践中不断探索,你会发现Lua的灵活性和...

    Lua 编程指南-Lua 编程入门教程

    对于想要学习Lua的开发者来说,不仅要掌握其基本语法,还需要深入了解如何将Lua与C/C++结合起来使用,以便更好地发挥这两种语言的优势。随着实践经验的积累,开发者将会发现Lua的更多潜力和应用场景。

    Lua飞机大战源码

    总结,Lua飞机大战源码展示了Lua在游戏开发中的实际应用,通过理解源码,我们可以学习到如何用Lua进行游戏逻辑控制、对象管理、输入处理、图形和音频操作等。对于想要深入学习Lua或游戏开发的读者来说,这是一个很好...

    lua中文手册lua-5.3-zh-manual.pdf

    上述内容是对Lua 5.3中文手册中涉及的知识点的总结和展开。实际使用Lua语言进行开发时,需要根据这些基础知识点进行编程实践,才能熟练掌握Lua的特性,发挥其在脚本编写、嵌入式系统开发等场景的优势。

    Lua脚本代码实例

    - 语法:Lua语法简洁,易于阅读,如`print("Hello, World!")`用于输出字符串。 2. CSV文件处理: - CSV格式:这是一种常见的数据交换格式,每一行代表一个记录,每个记录由逗号分隔的字段组成。 - 读取CSV:在...

    LuaForWindows

    1. **简洁的语法**:Lua语法简单明了,易于学习,没有复杂的语法规则,使得代码可读性高。 2. **动态类型**:Lua是动态类型的,变量无需声明类型,其类型由赋值决定。 3. **垃圾回收**:内置自动垃圾回收机制,...

    Beginning Lua Programming电子书

    - Lua语言基础语法介绍。 - 数据类型和变量。 - 控制结构(如条件语句、循环)。 - **进阶篇**: - 函数和模块。 - 错误处理和调试技巧。 - 面向对象编程。 - **高级篇**: - 性能优化技巧。 - C/C++扩展...

    lua与Android交互,基本实现

    总结,Lua与Android的交互是通过JNI和Lua引擎实现的,这为Android应用带来了更多的动态性和可扩展性。通过注册Java方法,Lua脚本可以直接调用Android的API,同时Android应用也能执行Lua脚本并获取其执行结果。合理...

    LUA脚本|LUA脚本支持库

    LUA的核心特点是简洁和高效,它拥有简单的语法结构,支持动态类型、自动内存管理以及垃圾回收机制。LUA脚本支持库通常包含一系列的模块,这些模块提供了额外的函数和数据结构,例如网络通信、文件操作、日期时间...

    Lua程序设计,2~4版本pdf电子书,C的Lua语言原滋原味

    Lua的核心语法简洁明了,易于学习。从第二版开始,Lua就已经具备了变量、数据类型(包括nil、boolean、number、string、table、function、userdata和thread)、控制结构(如if、while、for循环)以及函数等基本元素...

    LUA4反编译器

    LUA的语法简洁明了,支持变量、函数、表(类似哈希或关联数组)等基本数据类型,并提供了面向对象编程的机制。 **LUA字节码** LUA的源代码在执行前会被编译成字节码,这是一种中间表示形式,介于源代码和机器码...

Global site tag (gtag.js) - Google Analytics