Lua值与类型 · 花生肉泥

Lua基础语法之值与类型

Lua是一种动态类型语言。这意味着变量没有类型,只有值才有类型,所有的值都可以被放在变量里,当做参数传递到另一个函数中,并被函数作为结果返回。

1  
2  
3  
4  
5  
6  
7  
print(type("hello world"))       
print(type(10.4*3))                -- number  
print(type(print))                  -- function  
print(type(type))                  -- function  
print(type(true))                   -- boolean  
print(type(nil))                      -- nil  
print(type(type(X)))               

—|—

Lua中有八种基本类型分别为:

nil、boolean、number、string、function、userdata、thread和table

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

nil类型

nil类型只有一种值nil,它的主要用途,在于表识和别的任何值的差异;通常,当需要描述一个无意义的值得时候会用到它

boolean类型

boolean只有两种值:false和true,nil和false都能导致条件为假,而另外所有的值都被当做真,lua中认为0和空字符串都为真

number类型

number只表示实数,lua中没有整形
编译lua时,可以使用长整数或者单精度浮点型代替数值类型,可以支持到小数点后15位

string类型

string指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。

这意味着你可以存储任意的二进制数据在一个字符串里,lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串

string和其他对象一样,lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本书,lua可以高效的处理长字符串,1M的string在lua中很是常见。可以使用单引号或者双引号表示字符串

自动换算:

运行时,lua或自动在string和number之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。

1  
2  
3  
print("100"+"200")     -- 300  
print("100"+1)          -- 101  
print("100+200")          -- 100+200  

—|—

反过来,当lua期望一个string而碰到数字时,会将数字转成string

1  
2  
3  
print("hello".. 1 .."world")     --hello 1 world  
print("hello".. 1 .."world")     --hello 1 world  
print("hello".. 1.."world") -- 编译出错,当在一个数字后面写..时,必须加上空格以防止被解释错。  

—|—

尽管字符串和数字时可以自动转换,但两者是不同的,像10 == “10”这样的比较永远是错的。
如果需要显示将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil,反之,可以调用tostring()将数字转成字符串

1  
2  
print(tostring(10) == "10")     -- true  
print(10 .. "" == "10")      -- true  

—|—

1  
2  
3  
4  
local n,s = 111,"111"  
print(type(n),type(s))     -- number string  
n,s = tostring(n),tonumber(s)  
print(type(n),type(s))     -- string number  

—|—

funciton类型

lua可以调用lua或者C实现的函数,lua所有标准库都是用C实现的,标准库包括string库,table库,I/O库、OS库、math库、debug库

函数是第一类型(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值(函数名和函数加括号的不同)

1  
2  
3  
4  
5  
6  
7  
8  
funciton f1()  
     return true  
end  
  
local a = f1  
local b = f1()  
print(a)     --function:006AB730  
print(b)     --true  

—|—

userdata类型

userdata类型用来将任意C数据保存在lua变量中,userdata在lua中除了赋值和相等比较外没有预定义的操作。lua可以调用lua或者C是闲的函数,lua所有标准库都是用C实现的。

thread类型

thread类型用来区别独立的执行现场

table类型

关联数组可以用任何东西(除了nil)做索引,而不限于数字。table可以以不同类型的值构成,它可以包含所有的类型的值(除nil外)。table是lua中唯一的一种数据结构

支持以a.name的形式表示a[“name”],跟索引一样,table每个域中的值也可以是任何类型(除nil以外)。特别的,因为函数本身也是值,所以table的域中也可以放函数

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
local t = {1,2,"a","b",true,false,{a}}  
print("表长"..#t)  
for k,v in ipairs(t) do  
     print k,v  
end  
  
=====结果=====  
表长7  
1     1  
2     2      
3     a  
4     b  
5     true  
6     false  
7     table:001EB048  

—|—

获取变量类型的函数

type可以返回一个描述给定值的类型的字符串

1  
2  
3  
4  
5  
local t = {1,2,"a","b",true,flase,{a}}  
print(type(t[1]))     -- number  
print(type(t[3]))       
print(type(t[5]))     -- boolean  
print(type(t[7]))     -- tbale  

—|—

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017