當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Ruby Continuation類用法及代碼示例


本文簡要介紹ruby語言中 Continuation類 的用法。

Continuation 對象由 Kernel#callcc 生成,在 +require+d continuation 之後。它們擁有一個返回地址和執行上下文,允許從程序中的任何位置非本地返回到 callcc 塊的末尾。延續有點類似於 C 的setjmp/longjmp 的結構化版本(盡管它們包含更多狀態,因此您可能會認為它們更接近線程)。

例如:

require "continuation"
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
callcc{|cc| $cc = cc}
puts(message = arr.shift)
$cc.call unless message =~ /Max/

產生:

Freddie
Herbie
Ron
Max

您也可以在其他方法中調用 callcc :

require "continuation"

def g
  arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
  cc = callcc { |cc| cc }
  puts arr.shift
  return cc, arr.size
end

def f
  c, size = g
  c.call(c) if size > 1
end

f

這個(有點做作的)示例允許內部循環提前放棄處理:

require "continuation"
callcc {|cont|
  for i in 0..4
    print "#{i}: "
    for j in i*5...(i+1)*5
      cont.call() if j == 17
      printf "%3d", j
    end
  end
}
puts

產生:

0:   0  1  2  3  4
1:   5  6  7  8  9
2:  10 11 12 13 14
3:  15 16

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Continuation類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。