学习 成长 坚持每日一篇
基本数据类型
Lua 是动态类型语言,变量不要类型定义。Lua 中有 8 个基本数据类型分别为:nil、boolean、 number、string、userdata、function、thread 和 table。函数 type 可以测试给定变量或者值 的类型。
print(type("Hello world")) --> string
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)))--> string
变量之间可能保护任意一种类型的值
print(type(a))--> nil ('a' is not initialized) --> number
a = 10
print(type(a))-- yes, this is valid!
a = "a string!!"
print(type(a)) --> string
a = print -- yes, this is valid!
a(type(a)) --> function
注意:一般情况下同一变量代表不同类型的值容易造成混乱。最好不要这样用
Lua 中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为 nil;
给全局变量负 nil 可以删除该变量。
Booleans
两个取值 false 和 true。但要注意 Lua 中所有的值都可以作为条件。除了 false 和 nil 为假,其他值都为真。所以 Lua 认为 0 和空串都是真。
Numbers
Number表示实数。Lua 中没有整数。一般有个错误的看法 CPU 运算浮点数比整数慢。事实 不是如此,用实数代替整数不会有什么误差(除非数字大于 100,000,000,000,000)。Lua 的 numbers 可以处理任何长整数不用担心误差。你也可以在编译 Lua 的时候使用长整型 或者单精度浮点型代替 numbers,在一些平台硬件不支持浮点数的情况下这个特性是非 常有用的,具体的情况请参考 Lua 发布版所附的详细说明。和其他语言类似,数字常量 的小数部分和指数部分都是可选的,数字常量的例子:
4 0.4 4.57e-3 0.3e12 5e+20
注意:如果你的数特别大,用print打印该数时可能出现0,但并不代表该数值错误
Strings
重点介绍:lua的字符串是不可修改的,你可以创建一个新的变量存放你要的字符串
a = "one string"
b=string.gsub(a,"one","another") --changestringparts 用another替换 a中的one
print(a) --> one string
print(b) --> another string
字符串的内存分配和释放都是由系统控制的。Lua能高效出来长字符串,1M的string在Lua中也是很常见的。
可以用单引号或双引号表示字符串
a = "a line"
b = 'another line'
Lua的对于含有引号的字符可以用转意符\表示
\a bell
\b back space -- 后退
\f form feed-- 换页
\n newline -- 换行
\r carriage return -- 回车
\t horizontal tab -- 制表
\v vertical tab
\\ backslash -- "\"
\" double quote-- 双引号
\' single quote -- 单引号
\[ left square bracket -- 左中括号
\] right square bracket -- 右中括号
注意:Lua的中括号需要转意!这个有点��
我们还可以在字符串中用\ddd(ddd为三位十进制数)表示字母
还可以使用[[…]]表示字符串。这种形式的字符串可以包��多行也,可以嵌套且不会 解释转义序列,如果第一个字符是换行符会被自动忽略掉。这种形式的字符串用来包�� 一段代码是非常方便的。(这个真心强大��)
--page保存了一个HTML字符串
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
Lua
[[a text between double brackets]]
</BODY>
</HTML>
]]
Lua的string和number类型可以自动转换,字符串使用算术运算符时候会被自动转化为数字
print("10" + 1) --> 11
print("10 + 1") --> 10 + 1
print("-5.3e - 10" * "2")--> -1.06e-09
print("hello" + 1) -- ERROR (cannot convert "hello")不能强转hello
反过来,当 Lua 期望一个 string 而碰到数字时,会将数字转成 string。
print(10 .. 20) --> 1020
..在 Lua 中是字符串连接符。当在一个数字后面写..时,必须加上空格以防止被解释 错。
函数tonumber()可以显式转换,如果string不是正确数字会返回nil
> a = tonumber('我爱你11')
> print(a)-->nil
> a = tonumber('11')
> print(a)-->11
反之tostring()类似
Functions
函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数 的参数,也可以作为函数的返回值。这个特性给了语言很大的灵活性:一个程序可以重 新定义函数增加新的功能或者为了避免运行不可靠代码创建安全运行环境而隐藏函数, 此外这特性在 Lua 实现面向对象中也起了重要作用。
Lua 可以调用 lua 或者 C 实现的函数,Lua 所有标准库都是用 C 实现的。标准库包 括 string 库、table 库、I/O 库、OS 库、算术库、debug 库。
> function add()
>> a = 10;--这里要注意这里a是全局变量,要想定义局部变量要用local关键字好像,这个真心不习惯��
>> b = 100;
>> return a+b
>> end
> a = add;
> print(type(a))-->function
> print(a())-->110