我觉得我已经陷入了一个坑内。因为,安装了Lua和SublimeText3编辑器之后,怎么使自己编写的lua代码在untiy内运行起来,是个我完全不了解的机制。先放一放吧。首先,来回顾一下Lua的语法基础。

第一 起点

在Lua中具有一个Chunks的概念。Chunk是一系列语句,Lua执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个Chunk。一个代码块,可以是一个语句,一系列语句的组合,或者一个函数。

注意,在交互模式下,Lua通常把每一个行当作一个Chunk,但如果Lua一行不是一个完整的Chunk时,他会等待继续输入直到得到一个完整的Chunk.在Lua等待续行时,显示不同的提示符(一般是>>)。这个其实,木有太有用哦。

当然,Lua和其他语言一样,也有关键字,大体如下:

and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while

注意:Lua是大小写敏感的。

单行注释: -- 

块注释:--[[     ]]

第二 基本数据类型

  Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。函数type可以测试给定变量或者值的类型。

  Nil :一个全局变量没有被赋值以前,默认值为nil,给一个变量赋值为nil,表示释放该变量。

  Boolean:只有两个值,true和false。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。

  Numbers:表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers。

  Strings:指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着可以存储任意的二进制数据在一个字符串里。

  a、类型转换

  运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。另外,也可以使用tonumber()函数和tostring()函数显式地进行字符与数字的转换。tonumber()函数转换时,如果string不是正确的数字该函数将返回nil。 见代码实例:

--字符与数字的隐式转换
print("" + )
--输出结果为:,将字符10隐私转化为Number类型计算
print("hello" + )
--无法进行运算,即不能隐式将"hello"字符转化为Number计算
--[[
系统错误如下:
stdin:: attempt to perform arithmetic on a string value
stack traceback:
stdin:: in main chunk
[C]: ?
--]] --字符与数字的显式转换
print(tonumber("")+)
--输出结果为:
print(type(tostring()))
--输出结果为:string

    b、常用的字符处理函数介绍

string.char()函数根据传入的ASCII编码返回该编码对应的字符。如:string.char(10),表示字符换行符,10是换行符的ASCII编码。

string.len()函数求字符串的长度。
string.sub(aString, start, end) 函数返回指定字符串的子串。
string.format()函数格式化输出指定字符串。%s表示字符串,%d表示所有数字,%D表示非数字,%a表示字母,%c表示控制字符,%l小写字母,%p标点符号,%s空格符号,%u大写字母,%w字母数字,%x十六进制数,%z用0表示的字符。加%前缀可以让特殊符号也能用在格式化中(如:().%+_*?[ ^ $ ]),如%%代表百分比符号。%.4f表示小数点后有4位的浮点数,%02d.表示至少有两个数字的整数,如果不足两个数字则用0补足。
sting.find(sourceString, targetString) 函数在sourceString字符串中查找第一个符合targetString字符串的位置,如果找到则返回开始和结束的位置,没找到则返回nil。
string.gsub(sourceString, pattern, replacementString) 函数返回一个字符串,sourceString字符中满足pattern格式的字符都会被替换成replacementString参数的值。
string.gfind(sourceString, pattern) 函数遍历一个字符串,一旦查找到符合指定格式的字符串就返回该子串。
 
Functions:函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。Lua可以调用lua或者C实现的函数,Lua所有标准库都是用C实现的。标准库包括string库、table库、I/O库、OS库、算术库、debug库。
 
Userdata和Thread:userdata在Lua中除了赋值和相等比较外没有预定义的操作。
 
第三 表达式
  Lua中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。还可以是非传统的函数定义和表构造。
  算术表达式: 二元运算符 + - * / ^ (加减乘除幂),一元运算符 -(负值)。其中这些运算符的操作数都是实数。
  关系运算符: < > <= >= == ~=。这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。
  逻辑运算符: and or not。
值得注意的是,逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b

例如:

print( and ) -->
print(nil and ) --> nil
print(false and ) --> false
print( or ) -->
print(false or ) -->

一个很实用的技巧:如果x为false或者nil则给x赋初始值v

x = x or v

等价于

if not x then
x = v
end

and 的优先级比or高。

C语言中的三元运算符可以在Lua中实现,如下:

a ? b : c
等价于
(a and b) or c 或者直接写成 a and b or c

not的结果一直返回false或者true

print(not nil) --> true
print(not false) --> true
print(not ) --> false
print(not not nil) --> false

连接运算符:字符串连接,如果操作数为数字,Lua将数字转成字符串。

最重要的运算符的优先级,从高到低的顺序:

^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or 除了^和..外所有的二元运算符都是左连接的。
a+i < b/+ <--> (a+i) < ((b/)+)
+x^* <--> +((x^)*)
a < y and y <= z <--> (a < y) and (y <= z)
-x^ <--> -(x^)
x^y^z <--> x^(y^z)

Table表的构造

构造器是创建和初始化表的表达式,可以用{}创建一个空表。也可以直接初始化数组:
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}

如果想初始化一个表作为record使用可以这样:

a = {x=, y=} <--> a = {}; a.x=; a.y=

不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。

w = {x=, y=, label="console"}
x = {sin(), sin(), sin()}
w[] = "another field"
x.f = w
print(w["x"]) -->
print(w[]) --> another field
print(x.f[]) --> another field
w.x = nil -- remove field "x"

还可以将表table作为table的一个成员,从而构成多维表。

polyline = {color="blue", thickness=, npoints=,
{x=, y=},
{x=-, y=},
{x=-, y=},
{x=, y=}
}

Lua语法基础(1)---简介、基本数据类型、表达式的更多相关文章

  1. Java02-java语法基础(一)数据类型

    Java02-java语法基础(一)数据类型 一.语法基础 语句:以分号(;)结束 System.out.println(“Hello World !”); 语句块:用一组花括号({})括起来 { … ...

  2. Lua语法基础(2)--基本语法、函数

    上一篇编辑编辑着,发现,缩进出了问题.作为一个不是强迫症的人,实在是忍受不了同一级内容不同缩进方式的槽点,于是重开一篇吧.(万幸,这样的文章也只有我自己看.) 第四 基本语法 赋值语句,Lua可以对多 ...

  3. c# 基础部分 (基本数据类型-- 表达式)

    一 基础部分 1.常用的基本数据类型 int  longing(长整) shortint(短整) string(文本型) char(字符型) bool (布尔型) false true 2.常量于变量 ...

  4. lua语法 - 基础篇

    1. 注释 单行注释:--,类似于C++的// 多行注释:--[[ ... ]],类似于C++的/*...*/ 2. 语句 分隔符:分号或者空格,一般多行写一起,建议用分号 语句块:do ... en ...

  5. Lua语法基础(3)--迭代器和泛型for

    迭代器和闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功 ...

  6. Lua语法基础(二)

    1. 函数 1.1 函数声明 默认为全局 局部函数使用local关键字声明 1.2 参数 ...等同于Python中*args三个点表示可变参数 1.3 获取参数长度的两种方式 (1)将传入的参数.. ...

  7. Lua语法基础(一)

    1. 注释 -- 单行注释 --[[ 多行注释 --]] 2. 运行方式     (1)交互式运行         命令行下 lua进入交互模式     (2)命令行运行         lua + ...

  8. React 语法基础(一)之表达式和jsx

    react负责逻辑控制 reactdom负责渲染 本节知识点 有 1)变量的使用,简单使用. 1==>jsx中的注释 {/* */} 2===> 简单的渲染 app.js ps==> ...

  9. JS语法基础-基本使用及数据类型分类

    JS基础 --------------- 什么是JS? ------------------ JS的全称是Javascript. ----------------------------- 老婆和老婆 ...

随机推荐

  1. ios中Pldatabase的用法(2)

    @implementation AppGlobal static NSString* strHostName; static NSString* strVersion; static PLSqlite ...

  2. Swift3 根据秒数获取视频时长(转换成00:00:00时间格式)以及将时长转换成秒

    直接代码了: /// 秒转换成00:00:00格式 /// /// - Parameter secounds: <#secounds description#> /// - Returns ...

  3. 详解SpringMVC中Controller的方法中参数的工作原理——基于maven

    转自:http://www.tuicool.com/articles/F7byQn 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  4. quine

    发鸠之山,其上多柘木,有鸟焉,其状如乌,文首,白喙,赤足,名曰:"精卫",其鸣自詨(音同"笑").是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫,常衔 ...

  5. js中的getBoundingClientRect()函数

    在Chrome上,此函数返回结果包含x,y,它们的取值对应于left,top.但是x,y这种表示方式非常不直观(需要先理解x轴和y轴的方向),而left,top则清晰无歧义地表达了元素的位置.正是因此 ...

  6. linux shell 脚本攻略学习18--grep命令详解

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是unix/linux中用于文本搜索 ...

  7. java实现simhash算法

    一个牛人分享的,放在github上,用java实现,网络上还有很多用ruby写的   https://github.com/commoncrawl/commoncrawl/blob/master/sr ...

  8. 蓝牙进阶之路 (001) - HC-05蓝牙无线模块设置

    USB转串口的有线转接方式,实在太难看了,尤其是寻接头,那是相当的不方便.其它电器厂商都想把是接头做小,做精致,唯独串口接头还是那么庞大,感觉应该换一换了,都已经完全不符合这个时代的审美观了. 于是, ...

  9. 【Android】Android动态加载Jar、APK的实现

    本文介绍Android中动态加载Jar.APK的实现.而主要用到的就是DexClassLoader这个类.大家都知道Android和普通的Java虚拟机有差别,它只能加载经过处理的dex文件.而加载这 ...

  10. 【Servlet】java web 文件下载功能实现

    需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> & ...