Ruby v1.6 Class and Library Reference: Continuation

class Continuation |
Parent: | Object
Version: | 1.6

### Index:

call

`Continuation` objects are generated by `Kernel#callcc`. They hold a return address and execution context, allowing a nonlocal return to the end of the `callcc` block from anywhere within a program. Continuations are somewhat analogous to a structured version of C's `setjmp/longjmp` (although they contain more state, so you might consider them closer to threads).

For instance:

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

produces:

    Freddie
    Herbie
    Ron
    Max

This (somewhat contrived) example allows the inner loop to abandon processing early:

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

produces:

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

instance methods
call | cont.call( [args]* )
|  | Invokes the continuation. The program continues from the end of the `callcc` block. If no arguments are given, the original `callcc` returns `nil`. If one argument is given, `callcc` returns it. Otherwise, an array containing args is returned.
`callcc {|cont| cont.call }` | -> | `nil`
`callcc {|cont| cont.call 1 }` | -> | `1`
`callcc {|cont| cont.call 1, 2, 3 }` | -> | `[1, 2, 3]`

Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Copyright © 2000 Addison Wesley Longman, Inc. Released under the terms of the Open Publication License V1.0.
This reference is available for download.