Lua基本语法 (2)

编译执行与错误

-- 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"),不会输出任何内容。


4.dofil le

dofile就是会执行代码的家伙了,如下代码: dofile("./hello.lua");


5.require
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(结束)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值