赋值语句是改变一个变量的值.
1、赋值
例如: a = 120;
如果将一个变量赋值为nil等同删除这个变量
table,userdata,functions.类型的数据在赋值时并不会创建新的值而只是添加一个引用(即始终指向同一个对象)。
将数据作为函数的参数时也会进行赋值操作,作为参数table,userdata,functions同样是按引用传递的。
2、多重赋值
a,b,c = 1,2,3;
以上的写法等效于 a=1;b=2;c=3;多重赋值时,右边的操作数如果多于左边的变量数目则丢弃多余的,不足则返回nil。
a,b,c = 0; 结果是a等于 0 ,b,c都等于nil。
而不是a,b,c都等于0。
如果一个函数有多个返回值时,也可以使用多重赋值的方法,例如:
function getv()
local x,y = mouse.getPos(); --取当前鼠标坐标,有两个返回值
return x,y;
end;
x,y = getv();--getv函数有两个返回值
3、全局变量
对于一个从未使用过的变量,赋值将变量声明为全局变量.
_x = 100;
4、删除变量
将一个变量赋值为nil,删除这个变量。例:
_x = nil;
在LAScript中全局变量是不需要声明的,局部变量需要用local语句声明。
使用局部变量有两个好处 1.避免命名冲突 2.访问局部变量的速度比全局变量更快.
示例:
局部变量只能在当前作用域范围内有效。
作用域通常是指一个语句块。语句块有以下几种形式:
1、一个LAS文件
2、fap文件中的一个脚本区块。
3、一个函数。
4、以end;语句结束的语句块。例如do .... end;界定的语句块。
5、控制语句中的语句块。如判断语句、循环语句。
2、判断分支语句
win.consoleOpen();
if( 2>1 )then --如果(条件成立)那么
print("2大于1");--如果条件符合,会执行这里的代码
else --否则
print("2小于1");--如果条件不符合,会执行这里的代码
end;--结束if语句
3、多分支判断语句
4、嵌套判断语句
判断语句是允许多重嵌套的,一个判断语句允许包含另一个判断语句。
每个if总会匹配一个end;结束语句,所以可以避免在多重嵌套中发生混淆。
win.consoleOpen();
if( 2>1 and "abc"=="abc")then --如果(条件成立)那么
print("2大于1");--如果条件符合,会执行这里的代码
print("'abc'等于'abc'");--如果条件符合,会执行这里的代码
end;--结束if语句
为了清晰的表示嵌套的层次,需要根据嵌套的层次使用tab制表符缩进。
循环语句的作用是在满足条件时重复运行一个语句块。
fap模拟程序会自动循环,所以大多时候循环语句应当用在LAS脚本程序中。
1、while循环
while( 条件(逻辑表达式) and nStop() ) do
-- 需要重复运行的代码
end;
nStop()函数的作用是判断程序是否被终止。通常用来检测用户是否按下了“全部停止热键”(默认为Ctrl+Alt+L)
2、repeat语句
repeat
-- 需要重复运行的代码
until( 条件(逻辑表达式) or (nStop() == false) );
与while语句正好相反。 条件成立会终止循环。
巧用循环分支语句:
很明显上面这个repeat循环仅执行一次
而每个if ..... then 语句都可以中断跳出循环。
上面的代码也可以用if分支语句来实现。
使用repeat循环实现这种分支流程的好处是 1、可以在if语句的外部写代码 2、可以在任何位置用break退出语句块。
for循环分两种用法。
1、使用计数器循环
for 一个局部变量名作为计数器=表达式1表示初始值,表达式2表示最大值,表达式3表示步进 do
--需要循环执行的语句
end;
三个表达式仅在开始循环时计算一次。计数器变量仅在for循环内部有效。
步进可以省略,默认值为1。
下面是一个例子,计数器i从1循环到10,每次递增2。
泛型for循环语句的格式如下:
我们可以用while循环来描述泛型for循环的语义,如下:
do --创建一个独立的语句块
local 迭达器函数,集合对象,控制变量 = 迭达器工厂(参数)
local 返回值列表 = 迭达器函数(集合对象,控制变量);
while( 第一个返回值~=nil ) do --循环直到返回值为空
--其他语句
返回值列表 = 迭达器函数(集合对象,第一个返回值);
end;
end;
下面介绍一些比较常用的迭代器使用方法
更多关于迭代器的内容请参考: 使用迭代器
遍历table列表中的全部元素
win.consoleOpen(); --打开控制台窗口
tab ={k = 12,k2 = 345,67, k3 = "abcd"}
for k,v in pairs(tab) do
--k为键,v是匹配的值,在这里键值对无序的随机出现。
print(k,v);
end;
遍历table列表中的数组元素
win.consoleOpen(); --打开控制台窗口
tab ={12,345,67,"abcd"}
for i,v in ipairs(tab) do
--i为索引,v是指定位置的值,在这里键值对有序的出现。
print(i,v);
end;
用于字符串模式匹配,关于模式匹配在后面会详细介绍。
break 用来退出循环(for,repeat,while),return语句用来退出函数。
break及return只能出现语句块结尾,也就是end;语句的前面.
如果我们需要中途退出循环或者函数,可以这样写 do break end; 或者 do return 返回值 end;
在LAScript中是没有case语句的,因为case语句实际上就是if分支语句的另一种写法。
在其他编程语言中使用case语句是为了获得更快的速度。对于LAScript来说不支持case语句可以精简编译引擎以获得更快的速度。
下面是一个模拟的case语句实现。
-- 用一个table列表声明一个case类
case = {
[1] = function(msg)
win.messageBox( "1:"..msg)
end;
[2] = function(msg)
win.messageBox( "2:"..msg)
end;
[3] = function(msg)
win.messageBox( "3:"..msg)
end;
--如果找不到索引,调用default函数
default = function(self,k)
--返回一个空的匿名函数,避免函数调用失败
return function(msg) win.messageBox( k.."不存在") end;
end;
}
--下面两句代码为case列表重载索引操作符
--在case中找不到匹配的索引时会自动调用__index函数
setmetatable(case,case);
case.__index = case.default;
-- 测试一下
case[2]("测试");
case[9]("测试");