ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能.连续体说起来晦涩,其实还是很简单的,它有3个特点:

1. callcc方法会给代码块传一个连续体对象,你可以保存该对象;

2. 当调用连续体的call方法时指令流会跳转到callcc方法之后;

3. 如果给连续体的call方法传递对象,则callcc方法会返回该对象,如果不传递对象,callcc会返回nil.

我们下面参考一段实例代码,我加了注释.该代码用来生成Fibonacci数列和一个递增数列.两个类FibG和IncG都继承于"抽象类"G,G实现生成器的"抽象"事件驱动逻辑,而具体类FibG和IncG用来完成实际生成逻辑,全在代码里啦:

#!/usr/bin/ruby

require 'continuation'

#一个生成器"抽象"类
class G
	def initialize
		do_g
	end

	#@main_context实际是next的"出口",让next返回@main_context.call(v)的值,即生成的数
	def next
		callcc do |c|
			@main_context = c
			@g_context.call
		end
	end
private
	def do_g
		callcc do |c|
			@g_context = c
			return
		end
		g_loop	#虚方法,由实际具体类实现,但由G来调用!
	end

	#@g_context实际为G的内在驱动器,其会反复回到g_loop中不断生成新的数
	def g(v)
		callcc do |c|
			@g_context = c
			@main_context.call(v)
		end
	end
end

#具体的生成器类,用来生成Fibonacci数列
class FibG < G
private
	#具体类实现g_loop,实际要怎么生成必须由具体类说了算
	#g_loop不能直接由FibG的实例对象调用,而要通过G来驱动
	def g_loop
		g(1)
		a,b=1,1
		loop do
			g(b)
			a,b=b,a+b
		end
	end
end

class IncG < G
	def initialize(inc_val=10)
		super()
		@inc_val = inc_val
	end
<span style="font-size:18px;"></span><pre name="code" class="ruby">private
	def g_loop
		x=0
		loop do
			g(x+@inc_val)
			x+=@inc_val
		end
	end
end

f = FibG.new
100.times {printf "%d " % f.next}
puts

i = IncG.new
100.times {printf "%d " % i.next}
puts 

i = IncG.new(11)
100.times {printf "%d " % i.next}
												

一个简单的ruby生成器例子(用连续体Continuation实现)的更多相关文章

  1. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  2. Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境

    Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...

  3. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  4. 一个简单的iBatis入门例子

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...

  5. 2.1 一个简单的Web工程例子

    一个简单的Web工程例子 开发环境: Eclipse: Neon Release (4.6.0) JDK:1.8.0_92 Tomcat:8.5.9 Maven:3.3.9 1. 在Eclipse中创 ...

  6. 一个简单的web服务器例子

    一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问 ...

  7. Matlab高级教程_第二篇:一个简单的混编例子

    1. 常用的混编是MATLAB和VS两个编辑器之间的混编方式. 2. 因为MATLAB的核是C型语言,因此常见的混编方式是MATLAB和C型语言的混编. 3. 这里介绍一个简单的MATLAB语言混编成 ...

  8. 一个简单的Java程序例子以及其几种注释

    在说道主题前,先来啰嗦两句,o()︿︶)o 唉,不说两句心里就有个疙瘩,也许这就是所谓的强迫症吧,好了说说我想啰嗦的,其实也就是这样子的,关于Java开发工具箱的下载以及环境的配置.Java开发工具箱 ...

  9. perl 一个简单的面向对象的例子

    <pre name="code" class="python">[root@wx03 wx]# cat x1.pm package x1; use ...

随机推荐

  1. Gradle 的Daemon配置

    最近升级到Android 2.2.2之后,运行之前的项目特别卡,基本上2分钟,好的时候1分半,查询了Android官网的说明说daemon能够加快编译.于是我也尝试开启Daemon. 在Windows ...

  2. Android 深入理解Loader机制 让APP轻装上阵

    本文简书同步发布,谢谢关注. http://blog.csdn.net/sk719887916/article/details/51540610 Android开发者都经历过APP UI开发不当 会造 ...

  3. ajax post请求request.getParameter("")取值为null

    今天在写提交一个json数据到后台,然后后台返回一个json数据类型.但是发现后台通过request.getParamter("")取到的值为null. 于是写一个简单的ajax ...

  4. Ubuntu 安装 Mysql 5.6 数据库

    Ubuntu 安装 Mysql 5.6 数据库 1)下载: mysql-5.6.13-debian6.0-x86_64.deb http://dev.mysql.com/downloads/mirro ...

  5. Linux IPC实践(5) --System V消息队列(2)

    消息发送/接收API msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由ms ...

  6. Touch Handling in Cocos2D 3.x(一)

    原帖地址 Cocos2d 3.0 带来经过完全修正后的触摸处理系统.本篇博文将提供所有触摸相关的信息: 接收触摸 取得触摸位置 处理不同个触摸生命周期中的事件 实现一个拖放机制 让我们开始吧 ;) 通 ...

  7. 小强的HTML5移动开发之路(1)——HTML介绍

    来自:http://blog.csdn.net/dawanganban/article/details/17591373 HTML是HyperText Markup Language(超文本标记语言) ...

  8. 【一天一道LeetCode】#56. Merge Intervals

    一天一道LeetCode系列 (一)题目 Given a collection of intervals, merge all overlapping intervals. For example, ...

  9. Aliyun上Linux服务器挂载数据盘及速度测试

    原始文档来自于阿里云官方文档:  Linux 系统挂载数据盘 铁锚 于 2013年12月19日 根据自己的需要进行整理 操作系统: CentOS 6.3, 平台  : 阿里云 ECS 云服务器 1. ...

  10. centos vsftpd 553 Could not create file解决方法

    centos vsftpd 553 Could not create file解决方法   问题由于selinux引起的,问题解决办法:   www.2cto.com   输入:getsebool - ...