当前位置: 首页 > 编程笔记 >

Ruby中使用连续体Continuation实现生成器

袁阿苏
2023-03-14
本文向大家介绍Ruby中使用连续体Continuation实现生成器,包括了Ruby中使用连续体Continuation实现生成器的使用技巧和注意事项,需要的朋友参考一下

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}

 类似资料:
  • 续延是在运行中被暂停了的程序:即含有计算状态的单个函数型对象。当这个对象被求值时,就会在它上次停下来的地方重新启动之前保存下来的计算。对于求解特定类型的问题,能够保存程序的状态并在之后重启是非常有用的。例如在多进程中,续延可以很方便地表示挂起的进程。而在非确定性的搜索问题里,续延可以用来表示搜索树中的节点。 要一下子理解续延或许会有些困难。本章分两步来探讨这个主题。本章的第一部分会先分析续延在 S

  • 本文向大家介绍javascript实现连续赋值,包括了javascript实现连续赋值的使用技巧和注意事项,需要的朋友参考一下 最近项目接触,时间比较充足,到网上逛逛了逛无意中在网上发现了这个问题,预知的结果和真实结果相差太大。 请看下面代码 如果把代码拆开来看,结果就是我们所想的那样 分析代码: a.x=a={n:2} js的赋值运算是右结合的,上面等同于a.x=(a={n:2}) js的求值运

  • 我试图得到一个本机FTP连接工作到一个奇怪的FTP服务器在红宝石。它需要TLS和隐式SSL。我有一个FileZilla客户端配置和工作。这是我的代码: 我得到以下运行时错误,当我运行上述: 使用Ruby和传统的net/ftp gem(与TLS/SSL问题相关的各种错误),我似乎无法从服务器中获得任何东西。DoubleBagFTPS似乎是最有前途的宝石,但我还是犯了一个错误。可能是我没有正确调用op

  • 问题内容: 假设您在python中输入了数字,并且想生成一个连续数字列表,例如 你怎么能这样 问题答案: 在Python 3中,您可以像这样使用内置函数 注意1: Python 3.x的函数返回一个对象。如果需要列表,则需要使用答案中所示的功能将其显式转换为列表。 注意2: 我们将数字9传递给函数,因为,函数将生成直到给定数字但不包括数字的数字。因此,我们给出实际数字+ 1。 注意3: Pytho

  • chatgpt 是如何实现“继续生成”功能的 我用 chatgpt 翻译文档,当内容过多的时候,chatgpt 一次无法全部返回,会出现“继续生成”按钮,点击后会接着上一句继续生成。我使用其他的大语言模型就没有这种功能,想知道他们是怎么实现的?