类似unix的管道的ruby简单实现代码简单说明
来源:互联网 发布:mac 黑苹果安装驱动 编辑:程序博客网 时间:2024/06/05 19:04
此代码来自此处
class PipelineElement attr_accessor :source def initialize @fiber_delegate = Fiber.new do process end end def |(other) other.source = self other end def resume @fiber_delegate.resume end def process while value = input handle_value(value) end end def handle_value(value) output(value) end def input @source.resume end def output(value) Fiber.yield(value) endendclass Producer < PipelineElement def process while true value=readline.chomp handle_value(value) end endendclass Filter < PipelineElement def initialize @line=1 super() end def handle_value(value) value=sprintf("%5d %s",@line,value) output(value) @line=@line.succ endendclass Consumer < PipelineElement def handle_value(value) puts value endendproducer=Producer.newfilter=Filter.newconsumer=Consumer.newpipeline = producer | filter | consumerpipeline.resume
打印pipeline对象得到如下输出:
#<Consumer:0x8f08bf4 @fiber_delegate=#<Fiber:0x8f08a88>, @source=#<Filter:0x8f08db4 @line=1, @fiber_delegate=#<Fiber:0x8f08d60>, @source=#<Producer:0x8f09054 @fiber_delegate=#<Fiber:0x8f09038>>>>
PipelineElement段代码非常巧妙,将Fiber和Ruby的功能完全展示了出来。
producer=Producer.newfilter=Filter.newconsumer=Consumer.new此段将纤程挂起,再使用
pipeline = producer | filter | consumer
依次调用|重载函数,最终返回consumer对象,其中|函数将把实例赋给other(即:|后的参数)的source属性
使用
pipeline.resume运行consumer纤程,consumer执行process函数
def process while value = input handle_value(value) end end接下来调用父类的input函数跳到filter纤程,于是开始执行filter纤程的process,进而唤醒producer执行process,输入value并且handle_value,从而将value传回filter纤程的value,filter纤程接手handle_value
def handle_value(value) value=sprintf("%5d %s",@line,value) output(value) @line=@line.succ end再通过output将处理好的value传回consumer并且转回consumer纤程,consumer继续handle_value
def handle_value(value) puts value end
此时输出value,同时开始下一次while循环,同时也开始了下一次连续的纤程循环。
另外从打印出来的pipeline可以很清楚的看到此过滤链的层次:
#<Consumer:0x8f08bf4 @fiber_delegate=#<Fiber:0x8f08a88>, @source=#<Filter:0x8f08db4 @line=1, @fiber_delegate=#<Fiber:0x8f08d60>, @source=#<Producer:0x8f09054 @fiber_delegate=#<Fiber:0x8f09038>>>>
- 类似unix的管道的ruby简单实现代码简单说明
- unix 管道的实现
- linux c 中简单的管道实现
- 类似Google Calendar效果的简单实现
- 类似VM菜单的简单实现
- python实现类似awk的简单功能
- 简单实现toolTips类似的提示功能
- 管道的简单应用
- 简单的ruby 迭代器
- 简单的Ruby 类
- ruby简单的基础
- ruby简单的基础
- js 模拟实现类似c#下的hashtable的简单功能代码
- 简单实现类似Spring的在任意代码中获取Request的功能
- unix shell(壳)的简单实现
- unix ls命令的一个简单实现
- 200行python代码实现一个类似django的简单模板引擎
- UNIX 常用命令简单说明
- ASP.NET通过OracleCleint来访问数据库
- 控件自适应对话框大小
- 关系数据库的特点
- 初习C++点滴摘录之变成的一些规则与建议(7)
- Jeecg - MiniDao专题讲解公开课(2013-08-22 晚8:30-10:30 )
- 类似unix的管道的ruby简单实现代码简单说明
- 对 C++ 中 Lambda Function 的一点感想
- 基于opencv的中值滤波
- Java成为企业应用开发主流的原因?
- Java容器类概述
- windows 7操作系统搭建android开发环境
- c语言中数组,链表的区别
- 抽象类的简单示例
- 第一篇,