ruby基础 二

这一篇其实也算是Fiber编程的基础篇,只不过参数传递算是一个比较重要的主题,因此独立一节。参数传递发生在两个Fiber之间,作为Fiber之间通讯的一个主要手段。 首先,我们可以通过resume调用给Fiber的block传递参数:1 #resume传递参数给fiber2 f=Fiber.new do |a,b,c|3 p a,b,c4 end5 6 f.resume(1,2,3)7 这个例子展示了怎么向fiber的block传递参数,f这个fiber简单地将传入的参数打印出来并终止。 其次,Fiber#yield也可以传递参数给调用resume作为返回结果,猜猜下面的代码打印什么?1 #yield传递参数给resume2 f=Fiber.new do |a,b|3 Fiber.yield a+b,a-b p a,b4 end5 6 p f.resume(10,10)7 p f.resume(3,4)8 正确的答案是:[20, 0] 10 10 [10, 10]让我们分析下代码的执行过程:1、第6行第一次调用resume,传入10,10两个参数2、f开始执行任务,它的任务是调用Fiber#yield,并将参数相加和相减的结果作为参数给yield,也就是执行Fiber.yield 20,10 3、f调用yield之后挂起,返回root fiber,yield的两个参数10、20作为返回结果打印。4、第7行代码,root fiber再次调用resume并传入参数,f被切入并执行代码p a,b,打印a、b,a和b仍然是上次调用保存的10,而非resume传入的3和4。5、f执行完毕,返回p a,b的结果作为resume结果,也就是[10,10] 刚才看到上面yield向resume传递参数的例子中第二次调用resume的参数3和4被忽略了,事实上如果还存在一次yield调用,那么3和4将被作为yield的返回结果使用,这就是我们接下来将看到的,通过resume调用传递参数作为fiber中yield的返回结果:1 #resume传递参数给yield2 f=Fiber.new do3 1 + Fiber.yield4 end5 6 p f.resume(1)7 p f.resume(2)8 这次的打印结果将是:nil3 第一次调用resume传入的1将被忽略,因为f的block不需要参数,然后f执行1 + Fiber.yield,在yield的挂起,加法运算没有继续,因为yield的调用没有参数,因此第一次resume返回nil;第二次resume调用传入2,这时候2将作为Fiber#yield的调用结果跟1相加,完成加法运算,得到的结果就是3,这个结果作为fiber的返回值返回给调用者。 总结下上面我们谈到的四种传递参数的情形:通过resume向fiber的block传递参数、通过yield向调用者传递参数、通过resume向yield传递参数、fiber返回值传递给调用者。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值