Programming Ruby: The Pragmatic Programmer's Guide

# Programming Ruby ### The Pragmatic Programmer's Guide
Previous < | Contents ^ | Next >

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]`

Previous < | Contents ^ | Next >

Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Copyright © 2001 by Addison Wesley Longman, Inc. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/)).

Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.

Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.