Lua语言- 1

0- Lua语言介绍

特性

  • 轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 其它特性
    • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
    • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

1- 配置环境

用notepad++装插件

点击插件 -->插件管理 -->搜索luascript -->点击安装

点击插件 -->LuaScript -->Show Console

显示

尝试输入print("hello world")

2- 基本语法

第一个Lua程序

交互式编程

直接在下面输入

脚本式编程

可以将 Lua 程序代码保存到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:

print("hello world")
print("www.runoob.com")

注释

单行注释

两个减号

--
多行注释
--[[
多行注释
多行注释
--]]

标示符

定义变量为以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母,下划线,数字(0 到 9)。

Lua的保留字格式为下划线加大写字母。

Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。

关键词

保留关键字不能作为常量或变量或其他用户自定义标示符:

and break do else
elseif end flase for
function if in local
nil not or repeat
return then ture until
while goto

一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

全局变量

默认下,变量是认为全局的。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

删除一个全局变量,只需要将变量赋值为nil。

3- 数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型 描述
nil 表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值:false和true
number 表示双精度类型的实浮点数
string 字符串由一对“ ”或‘ ’来表示
function 由C或Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table 表(table)是一个”关联数组“,数组的索引可以是数字、字符串或表类型。在Lua里,table的创建的通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表

可以用type函数测试给定变量或者值的类型:

语句 结果
print(type("hello world")) string
print(type(5.3*8)) number
print(type(print)) function
print(type(type)) function
print(type(true)) boolean
print(type(nil)) nil
print(type(type(x))) string

nil(类似于null)

nil表示一种没有任何有效值,如:打印一个没有赋值的变量,输出一个nil值

>print(type(A))
 nil

对于全局变量和 table,nil 还有一个“删除”作用,,给全局变量或者 table 表里的变量赋一个 nil值,等同于把它们删掉,执行下面代码

tab1 ={ key1 = "val1", key2 = "val2","val3"}
for k,v in pairs(tab1) do
    print(k .. " - " .. v)
end

tab1.key1 =nil
for k ,v in pairs(tab1) do
    print(k .. " - " .. v)
end

运行结果

1 - val3   
key2 - val2
key1 - val1
1 - val3   
key2 - val2

nil作比较时应该加上双引号" :

>type(X)
 nil
>type(X)==nil
 false
>type(X) == "nil"
 true

type(x)==nil 结果为false的原因为type(x)实质是返回的“nil”字符串,是一个string类型:

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true :

print(type(true))
print(type(false))
print(type(nil))

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false") 
end
if 0 then
    print("数字 0 是 true")
else
    print("数字 0 为 false")
end

执行结果

number

Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

执行结果

string

字符串由一对双引号或单引号来表示

string1 = "this is string1"
string2 = "this is string2"

可以用2个方括号"[[]]"来表示”一块“字符串

html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">寒鹭网络安全团队</a>
</body>
</html>
]]
print(html)

执行结果

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字 :

以上代码中"error" + 1执行报错了,字符串连接使用的是 .. ,如:

使用 # 来计算字符串的长度,放在字符串前面,如下实例:

table(表)

table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表 :

	--创建一个空的table
	local table1 = {}
	--直接初始化表
	local table2 = {"apple","pear","orange","grape"}

表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。

	-- table_test.lua 脚本文件
	a = {}
	a["key"] = "value"
	key = 10
	a[key] = 22
	a[key] = a[key] + 11
	for k, v in pairs(a) do
	    print(k .. " : " .. v)
	end

执行结果

	10 : 33
	key : value

其中..类似于链接符

	a = "hello" .. ":".. "world"
	print(a)

执行结果

	hello:world
	a = "hello" ..  "world"
	print(a)

执行结果

	helloworld

同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始

-- table_test2.lua 脚本文件
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

执行结果

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

-- table_test3.lua 脚本文件
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

执行结果

val
nil

function

函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里

-- function_test.lua 脚本文件
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

执行结果

120
120

function 可以以匿名函数(anonymous function)的方式通过参数传递 :

-- function_test2.lua 脚本文件
function testFun(tab,fun)
        for k ,v in pairs(tab) do
                print(fun(k,v));
        end
end


tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
        return key.."="..val;
end
);

执行结果

key2=val2
key1=val1

thread(线程)

最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata(自定义类型)

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

posted @   白榆-  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
极恶都市 - 夏日入侵企划
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王星

作曲 : 灰鸿啊/皮皮

编曲 : 夏日入侵企画

制作人 : 邢硕

节奏吉他 : 肯尼

主音吉他 : 张伟楠

贝斯 : 皮皮

鼓 : 海鑫

和声 : 邢硕

音效制作 : 邢硕

录音 : 邢硕/夏国兴

混音 : 于昊

特别鸣谢 : 张伟楠

这城市的车流和这地表的颤抖

像一颗石子落入地心之后泛起的温柔

暗涌

河水流过转角她的楼

被梦魇

轻声呓语唤醒身后的幼兽

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都

已忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去陈旧的还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池已失守

最终无法占有

无眠辗转

伴着人间破碎的旧梦

像繁星

退却后只剩下混沌的夜空

炙热

掩盖风声鹤唳的担忧

把所有失落无助反手推入

无尽的白昼

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都已经忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池早已失守

惶恐难以接受

缠绵往复不肯放手

最终无法占有

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁 灭 即 拯 救

谁掠夺春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

明知城池已失守

缠绵往复不肯放手

最终无法占有

点击右上角即可分享
微信分享提示