Lua(第一天)基础知识

Lua 是什么?
 

1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de
Janeiro in Brazil)诞生了一门编程语言, 发明者是该校的三位研究人员, 他们给这
门语言取了个浪漫的名字—— Lua , 在葡萄牙语里代表美丽的月亮。 事实证明她
没有糟蹋这个优美的单词, Lua 语言正如它名字所预示的那样成长为一门简洁、 优
雅且富有乐趣的语言。
Lua 从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来
设计的, 因此她一直遵从着简单、 小巧、 可移植、 快速的原则, 官方实现完全采用
ANSI C 编写, 能以 C 程序库的形式嵌入到宿主程序中。

 Lua的特性

1. 变量名没有类型, 值才有类型, 变量名在运行时可与任何类型的值绑定;
2. 语言只提供唯一一种数据结构, 称为表(table), 它混合了数组、 哈希, 可以用
任何类型的值作为 key 和 value。 提供了一致且富有表达力的表构造语法, 使
得 Lua 很适合描述复杂的数据;
3. 函数是一等类型, 支持匿名函数和正则尾递归(proper tail recursion);
4. 支持词法定界(lexical scoping)和闭包(closure);
5. 提供 thread 类型和结构化的协程(coroutine)机制, 在此基础上可方便实现协作
式多任务;
6. 运行期能编译字符串形式的程序文本并载入虚拟机执行;
Lua 简介
18
7. 通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic metamechanism), 从而允许程序运行时根据需要改变或扩充语法设施的内定语义;
8. 能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;
9. 从 5.1 版开始提供了完善的模块机制, 从而更好地支持开发大型的应用程序;

 LuaJIT是什么?

LuaJIT 是采用 C 和汇编语言编写的 Lua 解释器与即时编译器。

Lua 基础数据类型

函数 type 能够返回一个值或一个变量所属的类型。

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

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

local表示局部变量
 

local num
print(num) -->output:nil
num = 100
print(num) -->output:100

boolean( 布尔)

布尔类型, 可选值 true/false; Lua 中 nil 和 false 为“假”, 其它所有值均为“真”。 比
如 0 和空字符串就是“真”;

local a = true
local b = 0
local c = nil
if a then
print("a") -->output:a
else
print("not a") --这个没有执行
end
if b then
print("b") -->output:b
else
print("not b") --这个没有执行
end
if c then
print("c") --这个没有执行
else
print("not c") -->output:not c
end

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

local order = 3.99
local score = 98.01
print(math.floor(order)) -->output:3
print(math.ceil(score)) -->output:99

string
Lua 中有三种方式表示字符串:
1、 使用一对匹配的单引号。 例: 'hello'。
2、 使用一对匹配的双引号。 例: "abclua"。
3、 字符串还可以用一种长括号( 即[[ ]]) 括起来的方式定义。
 

local str1 = 'hello world'
local str2 = "hello lua"
local str3 = [["add\name",'hello']]
local str4 = [=[string have a [[]].]=]
print(str1) -->output:hello world
print(str2) -->output:hello lua
print(str3) -->output:"add\name",'hello'
print(str4) -->output:string have a [[]]

table (表)
Table 类型实现了一种抽象的“关联数组”。 “关联数组” 是一种具有特殊索引方式的数
组, 索引通常是字符串( string) 或者 number 类型, 但也可以是除 nil 以外的
任意类型的值。
 

local corp = {
web = "www.google.com", --索引为字符串, key = "web",
-- value = "www.google.
-- com"
 telephone = "12345678", --索引为字符串
 staff = {"Jack", "Scott", "Gary"}, --索引为字符串, 值也是一个表
 100876, --相当于 [1] = 100876, 此时索引为数字
  --  key = 1, value = 100876
 100191, --相当于 [2] = 100191, 此时索引为数字
 [10] = 360, --直接把数字索引给出
 ["city"] = "Beijing" --索引为字符串
 }
  print(corp.web) -->output:www.google.com
  print(corp["telephone"]) -->output:12345678
  print(corp[2]) -->output:100191
  print(corp["city"]) -->output:"Beijing"
  print(corp.staff[1]) -->output:Jack
  print(corp[10]) -->output:360

function

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

关系运算符
注意: Lua 语言中“不等于”运算符的写法为: ~=

print(1 < 2) -->打印 true
print(1 == 2) -->打印 false
print(1 ~= 2) -->打印 true
local a, b = true, false
print(a == b) -->打印 false

逻辑运算符

 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, 否则返回 a。

local c = nil
local d = 0
local e = 100
print(c and d) -->打印 nil
print(c and e) -->打印 nil
print(d and e) -->打印 100
print(c or d) -->打印 0
print(c or e) -->打印 100
print(not c) -->打印 true
print(not d) -->打印 false

注意: 所有逻辑操作符将 false 和 nil 视作假, 其他任何值视作真, 对于 and 和
or, “短路求值”, 对于not, 永远只返回 true 或者 false。
 

字符串连接

在 Lua 中连接两个字符串, 可以使用操作符“..”( 两个点) 。 如果其任意一个操作
数是数字的话, Lua 会将这个数字转换成字符串。 注意, 连接操作符只会创建一个
新字符串, 而不会改变原操作数。 也可以使用 string 库函数 string.format 连
接字符串。

print("Hello " .. "World") -->打印 Hello World
print(0 .. 1) -->打印 01
str1 = string.format("%s-%s","hello","world")
print(str1) -->打印 hello-world
str2 = string.format("%d-%s-%.2f",123,"world",1.21)
print(str2) -->打印 123-world-1.21

控制结构 if-else
 

score = 90
if score == 100 then
print("Very good!Your score is 100")
elseif score >= 60 then
print("Congratulations, you have passed it,your score greate
r or equal to 60")
--此处可以添加多个elseif
else
print("Sorry, you do not pass the exam! ")
end


for 控制结构

--for var = begin, finish, step do
----body
--end
--


-- step 默认为1

for i = 1, 5 do
  print(i)
end


for i=1,10,2 do
  print(i)
end

 foreach

-- 打印数组a的所有值
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end


-- Lua 的基础库提供了 ipairs, 这是一个用于遍历数组的迭代器函数。 在每次循环
-- 中, i 会被赋予一个索引值, 同时 v 被赋予一个对应于该索引的数组元素值。 


local days = {"Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday","Sunday"}

local revDays = {}
for k,v in pairs(days) do 
  revDays[v] = k 
end 

-- print value

for k,v in pairs(revDays) do
   print("k:", k, " v:", v)
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一彡十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值