博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby Fiber指南(二)参数传递
阅读量:5798 次
发布时间:2019-06-18

本文共 1354 字,大约阅读时间需要 4 分钟。

 
   
   
   
   
    这一篇其实也算是Fiber编程的基础篇,只不过参数传递算是一个比较重要的主题,因此独立一节。参数传递发生在两个Fiber之间,作为Fiber之间通讯的一个主要手段。
    首先,我们可以通过resume调用给Fiber的block传递参数:
1 
#
resume传递参数给fiber
2 
f
=
Fiber.new do 
|
a,b,c
|
3 
   p a,b,c
4 
end
5 
6 
f.resume(
1
,
2
,
3
)
7 
这个例子展示了怎么向fiber的block传递参数,f这个fiber简单地将传入的参数打印出来并终止。
    其次,Fiber#yield也可以传递参数给调用resume作为返回结果,猜猜下面的代码打印什么?
1 
#
yield传递参数给resume
2 
f
=
Fiber.new do 
|
a,b
|
3 
  Fiber.
yield
 a
+
b,a
-
b
    p a,b
4 
end
5 
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传递参数给yield
2 
f
=
Fiber.new do
3 
   
1
 
+
 Fiber.
yield
4 
end
5 
6 
p f.resume(
1
)
7 
p f.resume(
2
)
8 
这次的打印结果将是:
nil
3
   第一次调用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返回值传递给调用者。
    文章转自庄周梦蝶  ,原文发布时间2010-03-11

转载地址:http://dnpfx.baihongyu.com/

你可能感兴趣的文章
C#字符串的不变性
查看>>
前端路由简介以及vue-router实现原理
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
分享15款很实用的 Sass 和 Compass 工具
查看>>
AMD优势: 与众不同 选择丰富
查看>>
玩转高性能超猛防火墙nf-HiPAC
查看>>
简单按日期查询mysql某张表中的记录数
查看>>
自动化部署之jenkins发布PHP项目
查看>>
C/C++编程可用的Linux自带工具
查看>>
Oracle ASM 翻译系列第六弹:高级知识 如何映射asmlib管理的盘到它对应的设备名...
查看>>
多线程之volatile关键字
查看>>
如何判断webview是不是滑到底部
查看>>
Raptor实践2——控制结构
查看>>
Smartisan OS一步之自定义拖拽内容
查看>>
海贼王十大悲催人物
查看>>
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 搞定!
查看>>
热点热词新闻资讯API开放接口(永久免费开放)
查看>>
【第二章】 IoC 之 2.2 IoC 容器基本原理 —— 跟我学Spring3
查看>>
8.1_Linux习题和作业
查看>>
11.排序算法_6_归并排序
查看>>