Custom Control Structures
Ruby’s use of blocks, coupled with its parentheses-optional syntax,
make it very easy to define iterator methods that look like and behave
like control structures. The loop
method of Kernel is a simple example.
In this section we develop three more examples. The examples here use
Ruby’s threading API; you may need to read Threads and Concurrency to
understand all the details.
Delaying and Repeating Execution: after and every
Example 8-1 defines global methods named
after and every. Each takes a numeric argument that
represents a number of seconds and should have a block associated with
it. after creates a new thread and
returns the Thread object
immediately. The newly created thread sleeps for the specified number
of seconds and then calls (with no arguments) the block you provided.
every is similar, but it calls the
block repeatedly, sleeping the specified number of seconds between
calls. The second argument to every
is a value to pass to the first invocation of the block. The return
value of each invocation becomes the value passed for the next
invocation. The block associated with every can use break to prevent any future
invocations.
Here is some example code that uses after and every:
require 'afterevery' 1.upto(5) {|i| after i { puts i} } # Slowly print the numbers 1 to 5 sleep(5) # Wait five seconds every 1, 6 do |count| # Now slowly print 6 to 10 puts count break if count == 10 count + 1 # The next value of count end sleep(6) # Give the above time to ...