Rootroute ruby language pages |
a ? b : c
mean?
It's the same as saying if a then b else c end
.
Assuming that the file ends in a linefeed, the following code may give the fastest result.
open("example").read.count("\n") # -> 3 |
begin
and end
of MatchingData return?
They act with $ , and return the start index and the end index of the matched data ($0) in the original string. See an example in tab expansion.
Rather than solve the specific problem, let's solve the general
case. The first thing we'll do is produce a method that will iterate
over an Enumerable
object and collect a single
result. Smalltalk calls that method inject
, so we will too:
module Enumerable # inject(n) { |n, i| ...} def inject(n) each { |i| n = yield(n, i) } n end end |
Notice how we've added the method to Enumerable
. This means
that anything that includes Enumerable
can now use
inject. But how do we use it? It takes a single argument `n' and a
block. For each element in the thing being enumerated, it calls the
block, passing in `n' and the element
itself. The result of the block is assigned back to `n'. So, to define
sum
, we could write:
module Enumerable def sum inject(0) {|n, i| n + i } end end [1,3,5,7,9].sum # -> 25 (1..100).sum # -> 5050 |
Ruby's continuations allow you to create an object representing a place in a Ruby program, and then return to that place at any time (even if it has apparently gone out of scope). Continuations can be used to implement complex control structures, but are typically more useful as ways of confusing people.
In [ruby-talk:4482], Jim Weirich posted the following examples of continuations:
# -------------------------------------------------------------------- # Simple Producer/Consumer # -------------------------------------------------------------------- # Connect a simple counting task and a printing task together using # continuations. # # Usage: count(limit) def count_task(count, consumer) (1..count).each do |i| callcc {|cc| consumer.call cc, i } end nil end def print_task() producer, i = callcc { |cc| return cc } print "#{i} " callcc { |cc| producer.call } end def count(limit) count_task(limit, print_task()) print "\n" end |
# -------------------------------------------------------------------- # Filtering Out Multiples of a Given Number # -------------------------------------------------------------------- # Create a filter that is both a consumer and producer. Insert it # between the counting task and the printing task. # # Usage: omit (2, limit) def filter_task(factor, consumer) producer, i = callcc { |cc| return cc } if (i%factor) != 0 then callcc { |cc| consumer.call cc, i } end producer.call end def omit(factor, limit) printer = print_task() filter = filter_task(factor, printer) count_task(limit, filter) print "\n" end |
# -------------------------------------------------------------------- # Prime Number Generator # -------------------------------------------------------------------- # Create a prime number generator. When a new prime number is # discovered, dynamically add a new multiple filter to the chain of # producers and consumers. # # Usage: primes (limit) def prime_task(consumer) producer, i = callcc { |cc| return cc } if i >= 2 then callcc { |cc| consumer.call cc, i } consumer = filter_task(i, consumer) end producer.call end def primes(limit) printer = print_task() primes = prime_task(printer) count_task(limit, primes) print "\n" end |