Lua基础学习

1:Lua简单介绍

         Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)

        作为一个扩展式语言,Lua 没有 “main” 程序的概念:它只能 嵌入 一个宿主程序中工作,这个宿主程序被称作 embedding program 或简称为 host 。宿主程序可以通过调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注入 C 函数让 Lua 代码调用。这些扩展的 C 函数,可以大大的扩展了 Lua 可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。Lua 的官方发布版就包含了一个叫做lua的简单的宿主程序,它用 Lua 库提供了一个保证独立的 Lua 解释器.

        Lua非常高效,它运行得比许多其它脚本(如Perl、Python、Ruby)都快,这点在第三方的独立测评中得到了证实。尽管如此,仍然会有人不满足,他们总觉得“嗯,还不够快!”。
LuaJIT 就是一个为了再榨出一些速度的尝试,它利用即时编译(Just-in Time)技术把 Lua 代码编译成本地机器码后交由 CPU 直接执行。LuaJIT 2 的测评报告表明,在数值运算、循环与函数调用、协程切换、字符串操作等许多方面它的加速效果都很显著。凭借着 FFI 特性,LuaJIT 2 在那些需要频繁地调用外部 C/C++ 代码的场景,也要比标准 Lua 解释器快很多。目前 LuaJIT 2 已经支持包括 i386、x86_64、ARM、PowerPC 以及 MIPS 等多种不同的体系结构。

        LuaJIT 是采用 C 和汇编语言编写的 Lua 解释器与即时编译器。LuaJIT 被设计成全兼容标准的 Lua 5.1 语言,同时可选地支持 Lua 5.2 和 Lua 5.3 中的一些不破坏向后兼容性的有用特性。因此,标准 Lua 语言的代码可以不加修改地运行在 LuaJIT 之上。LuaJIT 和标准 Lua 解释器的一大区别是,LuaJIT 的执行速度,即使是其汇编编写的 Lua 解释器,也要比标准 Lua 5.1 解释器快很多,可以说是一个高效的 Lua 实现。另一个区别是,LuaJIT 支持比标准 Lua 5.1 语言更多的基本原语和特性,因此功能上也要更加强大

     大家可以去http://luajit.org/download.htmlhttp://www.lua.org/download.html去配置自己的lua运行环境

    想学习lua的可以看如下的教程

    OpenResty最佳实践 

    Lua简明教程 | 酷 壳 – CoolShell.cn

    Lua 5.3 参考手册

    Lua 5.1 参考手册

2:HelloWorld简单程序

   helloworld.lua

print("Hello World")

  直接在命令行用lua或luajit运行

lua helloworld.lua
luajit helloworld.lua

也可以把HelloWorld修改如下当作shell一样运行

#!/usr/local/bin/lua
print("Hello World")

3:语法

   
    注释

    

--两个减号是单行注释

--[[
这是块注释
这是块注释
--]]

  

简单 数据类型

 

print(type("hello world")) -->output:string
print(type(print))         -->output:function
print(type(true))          -->output:boolean
print(type(360.0))         -->output:number
print(type(nil))           -->output:nil

    
string(字符串)有三种表示法
1:使用一对匹配的单引号。例:’test’
2:使用一对匹配的双引号。例:”test”
3:字符串还可以用一种长括号(即[[ ]])括起来的方式定义

在Lua中,函数也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值

local function foo()
    print("in the function")
    --dosomething()
    local x = 10
    local y = 20
    return x + y
end

local a = foo    --把函数赋给变量

print(a())

--output:
in the function
30

boolean(布尔)
布尔类型,可选值true/false;Lua 中 nil 和 false 为“假”,其它所有值均为“真”。比如 0 和空字符串就是“真”;好多人会对此感到惊讶

number(数字)
Number 类型用于表示实数,和 C/C++ 里面的 double 类型很类似。可以使用数学函数 math.floor(向下取整)和 math.ceil(向上取整)进行取整操作

nil(空)
nil是一种类型,Lua将nil用于表示“无效值”。一个变量在第一次赋值前的默认值是nil,将nil赋予给一个全局变量就等同于删除它

表达式中值的注意的地方

Lua 语言中“不等于”运算符的写法为:~=
Lua 中的 and 和 or 是不同于 c 语言的。在 c 语言中,and 和 or 只得到两个值 1 和 0,其中 1 表示真,0 表示假。而 Lua 中 and 的执行过程是这样的:
a and b 如果 a 为 nil,则返回 a,否则返回 b
a or b 如果 a 为 nil,则返回 b,否则返回
所有逻辑操作符将 false 和 nil 视作假,其他任何值视作真,对于 and 和 or,“短路求值”,对于not,永远只返回 true 或者 false
在Lua中连接两个字符串,可以使用操作符“..”(两个点)。如果其任意一个操作数是数字的话,Lua 会将这个数字转换成字符串
4:控制结构

 if-else
--单个if分支型
x = 8
if x > 0 then
    print("X大于0")
end

--两个分支: if-else 型
x = 8
if x > 0 then
    print("X大于0")
else
    print("X不大于)")
end

--多个分支: if-elseif-else型
score = 60
if score == 100 then
    print("满分")
elseif score >= 60 then
    print("及格以上")
elseif  score >= 30 then
    print("比较差")
else
    print("很差")
end

while型控制结构
x = 1
sum = 0

while x <= 10 do
    sum = sum + x
    x=x+1
end
print(sum)

for循环

--输出1到10
for i = 1 ,10 , 1 do
	print(i)
end

--便利table
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end

5:Lua函数

  函数的定义

  Lua 使用关键字function定义函数,语法如下

 

function function_name (arc)  --arc表示参数列表,函数的参数列表可以为空
   --content
end

 

 

上面的语法定义了一个全局函数,名为 function_name. 全局函数本质上就是函数类型的值赋给了一个全局变量,即上面的语法等价于

function_name = function (arc)
  --content
end

由于全局变量一般会污染全局名字空间,同时也有性能损耗(即查询全局环境表的开销),因此我们应当尽量使用“局部函数”,其记法是类似的, 只是开头加上 local 修饰符:

local function function_name (arc)  --arc表示参数列表,函数的参数列表可以为空
   --content
end

由于函数定义本质上就是变量赋值,而变量的定义总是应放置在变量使用之前,所以函数的定义也需要放置在函数调用之前

>Lua具有一项与众不同的特性,允许函数返回多个值。Lua的库函数中,有一些就是返回多个值,返回多个值时,值之间用“,”隔开

先到这儿吧,把lua基本的语法知识介绍完毕。大部份内容都参照了https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/main.html

此条目发表在 好文推荐 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。