• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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}

    上一篇:Ruby简洁学习笔记(二):类继承、属性、类变量
    下一篇:ruby实现的文件自删除代码分享
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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