-- local name="张三"
-- if name~="张三"then
-- error("错了")
-- end
-- assert(表达式);断言
-- 如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。
local name = "李四"
local result = assert(name=="李3","你不是")
function text( )
print(f[1])
end
if pcall(text)then print("正常")
else print("错")
end
函数test执行的时候肯定会报错的,因为并不存在a这个table.
使用pcall调用test函数,如果test不报错,则pcall返回ture,否则,返回false.
3.loadfile
loadfile-只编译,不运行loadfi le故名思议,它只会加载文件,编译代码,不会运行文件里的代码。
比如,我们有一个hello.lua文件,当我们调用下面代码的时候,loadfile("hello.lua"),不会输出任何内容。
dofile就是会执行代码的家伙了,如下代码: dofile("./hello.lua");
require只执行一次,require和dofile有点像不过又很不一样,require在第一次加载文件
的时候会执行里面的代码。但是,第二次之后,再次加载文件,则不会重复执行了。换句话说,它会保存已经加载过的文件,不会重复加载。
fori= 1,5 do
require("hello");
end
详细介绍 :loadfile会从文件加载Lua代码但是不会执行代码,最后将编译的结果作为一个函数返回,此外loadfile不会引|发错误,它只是返回错误值并不处理错误。
协同程序
local co = coroutine.create(functio print("hello coroutine"); end);
协同的程序的操作都在coroutine里,create函数的参数就是协同程序要执行的函数就这
么运行代码是没有效果的。
因为协同程序创建后,默认是挂起状态。
协同程序的四种状态分别为:挂起(suspended)、运行(running)\、死亡(dead)、正常(normal)。
要想协同程序运行起来,就要调用resume函数。
local co = coroutine.create(function ( )
for i=1 ,2,1 do
print("hello");
-- 协同程序调用coroutine.yield()挂起
coroutine.yield()
end
end )
-- 想要协同程序运行起来,就要调用coroutine.resume
coroutine.resume (co)
-- 打印协同状态
print(coroutine.status(co))
coroutine.resume (co)
-- 从挂起的第二次,打印状态
print(coroutine.status(co))
coroutine.resume (co)
-- dead死亡
print(coroutine.status(co))
结果:hello
suspended
hello
suspended
dead
这就是这段代码的特殊之处了。resume返回两个值第一个值代表协同程序是否正常执行(true或false),第二个返回值自然是代表错误信息。没有错误就返回nil.
我们试试让协同程序出现错误:
local co = coroutine.create(function ( )
-- error("错1")end
)
local result ,msg=coroutine.resume(co)
print(result)
print(msg)
3.resume函数的参数
resume函数除了第一个参数是协同程序外,第二个参数为“ resumeparame'
local co = coroutine.create(function (name )
print(name)
end
)
coroutine.resume(co,222)结果:222
4.resume函数的第二个返回值
resume函数有两个返回值。一个代表协同呈序是否正确执行,一个代表错误信息。如果协同程序正确执行,错误信息这个返回值自然就是 nil了.然后,这里还有一个规则,那就是yield函数的参数可以传递到resume的第二个返回值里。
local co = coroutine.create(function (name )
print(name)
coroutine.yield("yield")
end
)
local result ,msg=coroutine.resume(co,333)
print(msg) 运行结果:333 yield
5.yield函数的返回值
第一次执行的时候协同程序第一次被挂起,所以yield的返回要等待第二次resume 被调用时才能得到。
于是第二次调用resume时,首先就得到了上一次yield的返回值了,这个返回值正是resume的第二个参数。
没错 resu me的第二个返回值是yi eld的参数,而yield的返回值,是resu me的第二个参数。
再简单一些,resume的返回值是yield的参数,yield的返回值是resu me的参数。
同时,resume的第二个参数也能传递给协同程序的函数。
local co = coroutine.create(function (name )
for i=1,3 do
print(name)
print("cd:" ..coroutine.yield("yield"))
end return "结束"
end)
for i=1,4 do
print("...d第" ..i .."执行")
local result ,msg=coroutine.resume(co,333)
print(msg)
end
结果:
...d第1执行
333
yield
...d第2执行
cd:333
333
yield
...d第3执行
cd:333
333
yield
...d第4执行
cd:333
nil(结束)