lua学习(一)

  1. 下载最新版的lua,然后解压
  2. 运行“终端”进入到该文件夹下 ,主要是cd 【文件夹名】
    3.在“终端”输入 make macosx (回车)
    4.在“终端”输入 make test (回车)
    正常情况下会出现: src/lua -v
    Lua 5.2.0 Copyright(C)1994-2011 Lua.org,PUC-Rio
    5.然后再输入“sudo make install”命令,会要求输入Password: 输入相应密码(你的密码),然后回车就自动安装了
    待安装完成后可输入 lua -v,回车就会看到 :Lua 5.2.0 Copyright (C) 1994-2011 Lua.org, PUC-Rio
    OK ,已经安装成功!

Sublime Text配置
Tools->build system->new build system
输入:
{
“cmd”: [“/usr/local/bin/lua”, “$file”],
“file_regex”: “^(…?):([0-9]):?([0-9]*)”,
“selector”: “source.lua”
}
保存为Lua.sublime-build,然后Tools-Build System上就能选择lua来编译脚本了

lua语法学习:
不要用_加大写字母标识符,因为lua保留字也是这个格式
lua区分大小写
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量
在默认情况下,变量总是认为是全局的。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
如果你想删除一个全局变量,只需要将变量赋值为nil。
这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
lua数据类型学习:
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
这里写图片描述

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

if(a=="nil")

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

function table_maxn(t)
  local mn=nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)

tbl 最大值: 34
tbl 长度 3
我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
可以使用以下方法来代替:

function table_leng(t)
  local leng=0
  for k, v in pairs(t) do
    leng=leng+1
  end
  return leng;
end

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

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
);

thread(线程)
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
userdata(自定义类型)
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

注意!:

  • 运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时, string 就会被转成数字。
    print(“10”+ 1) –> 11
    print(“10 + 1”) –> 10 + 1
    print(“hello”+ 1) – 报错 (无法转换 “hello”)
    反过来,当 Lua 期望一个 string 而碰到数字时,会将数字转成 string。
    print(10 .. 20) –> 1020
    .. 在Lua中是字符串连接符,当在一个数字后面写 .. 时,必须加上空格以防止被解释错。
  • 匿名函数可以在后续调用时再对其续写,如testfun(tab,abc)中abc定义为一个两参数的函数,在后边调用testFun(tab,function(key,val)…..中续写具体函数
function testFun(tab,abc)
    for k ,v in pairs(tab) do
        print(abc(k,v));
    end
end


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

我们还可以随时改变这个匿名函数如:

function testFun(tab,fan)
    for k ,v in pairs(tab) do
        print(fan(k,v));
    end
end


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

tab2={key1="val3",key2="val4"};
testFun(tab2,
function(key,val)--匿名函数2
    return key.."+"..val;
end
)
tab = {"Hello","World",a=1,b=2,z=3,x=10,y=20,"Good","Bye"}
for k,v in pairs(tab) do
    print(k.."  "..v)
end

如上代码输出结果存在一定规律,”Hello”、”World”、”Good”、”Bye”是表中的值,在存储时是按照顺序存储的,并且不同于其他脚本语言,Lua是从1开始排序的,因此,使用pairs遍历打印输出时,会先按照顺序输出表的值,然后再按照键值对的键的哈希值打印。

1  Hello
2  World
3  Good
4  Bye
x  10
y  20
z  3
b  2
a  1

Lua变量:
变量在使用前,必须在代码中进行声明,即创建该变量。
编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。

可以用x, y = y, x进行交换值,不会发生覆盖问题

应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突。
2. 访问局部变量的速度比全局变量更快。

Lua循环:
Lua 语言提供了以下几种循环处理方式:
这里写图片描述
数值for循环
Lua 编程语言中数值for循环语法格式:

for var=exp1,exp2,exp3 do  
    <执行体>  
end  

var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次”执行体”。exp3是可选的,如果不指定,默认为1。

for i=1,f(x) do
    print(i)
end

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

for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
泛型for循环
泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。
Lua 编程语言中泛型for循环语法格式:

--打印数组a的所有值  
for i,v in ipairs(a) 
    do print(v) 
end  

注意

在lua中pairs与ipairs两个迭代器的用法相近,但有一点是不一样的:
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
pairs遍历表中全部key,value
ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。这就导致如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素。

for 循环中,循环的索引 i 为外部索引,修改循环语句中的内部索引 i,不会影响循环次数:

for i=1,10 do
    i = 10
    print("one time,i:"..i)
end

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012456019/article/details/80980764