关于ruby continuation的以下代码有什么问题?

时间:2014-09-14 13:58:50

标签: ruby

这里的红宝石新手。试图编写一个简单的ruby代码来继续,但下面的代码将打印非停止整数2,3,4,5,6 ......(每行一个数字)。这里肯定有一个明显的错误。感谢。

require "continuation"

def dum ()
    i = 1
    callcc {|cc| $c = cc}
    i += 1
    puts i
end

dum()   #expect to print 2
$c.call #expect to print 3
$c.call #expect to print 4

我的红宝石翻译是1.9.3p0

1 个答案:

答案 0 :(得分:3)

$ c.call完全跳回设置的执行上下文,因此你的脚本在调用dum()和调用$ c.call的第一行之间反复交替,从不到达最后一行。这是流程:

  1. dum()方法已定义
  2. dum() #expect to print 2:脚本调用dum()一次,为$c设置执行上下文,然后打印2
  3. $c.call #expect to print 3跳回到前一行对dum()的调用 - 执行的顶级上下文字面上会移回上一行。这次dum()打印3
  4. 该脚本现在到达相同的$c.call #expect to print 3行,并将继续在这两行之间无限制地交替。
  5. 该脚本永远不会到达您的最后一行$c.call #expect to print 4

    修改脚本以产生预期输出的一种方法:

    require "continuation"
    
    def dum ()
        i = 1
        callcc {|cc| $c = cc}
        i += 1
        puts i
        return i
    end
    
    k = dum()   #expect to print 2
    $c.call unless k >= 4 # reach this line 3 times: print 3, and then 4, and then move on
    

    我希望这会有所帮助。