The Object-Oriented Programming Language RubyDe Nederlandse Ruby Homepage



Vorige Home Nederlands Volgende


11. Andere zaken



11.1 Wat heeft a ? b : c te betekenen?

Ditis hetzefde als zeggen  if a then b else c end.

11.2 Hoe tel ik het aantal regels in een bestand?

Ervan uitgaand dat het bestand eindigd met een linefeed, is de volgende code het snelst:

   
open("example").read.count("\n")  # -> 3

11.3 Wat geven begin and end van MatchingData terug?

Ze werken samen met $ , en geven de start index en de end index van de gematchte gevens ($0) in de oorspronkelijke string. Zie voor een voorbeeld tab expansion.

11.4 How totaliseer ik de elementen van een array?

In plaats van een specifieke vraag op te lossen is het beter het algemene probleem aan te pakken. Het eerste wat we doen is een methode maken die over een  Enumerable object itereerd en een enkel resultaat teruggeeft. Smalltalk noemt deze methode inject, dus wij ook:

   
module Enumerable

# inject(n) { |n, i| ...}
def inject(n)
each { |i|
n = yield(n, i)
}
n
end
end

Merk op de we de methode hebben toegevoegd aan Enumerable. Dit betekend dat alles wat Enumerable als mixin gebruikt ook inject kan gebruiken. Maar hoe gebruiken we het? Het vraagt een enkelvoudig argument `n' en een  block. Voor ieder element in het ge-enumereerde object roept de methode het block aan met `n' en het element als argument. Het resultaat van het block wordt toegekend aan `n'. Dus om sum, te definieeren schrijven we:

   
module Enumerable
def sum
inject(0) {|n, i| n + i }
end
end

[1,3,5,7,9].sum # -> 25
(1..100).sum # -> 5050

11.5 Hoe gebruik ik continueringen?

Ruby's continueringen zijn objecten die een plaats in een Ruby programma uitdrukken en zij maken het mogelijk om naar die plaats terug te keren (zelfs als die plek ogenschijnlijk niet meer in scope is). Continueringen kunnen gebruikt worden om complexe controle structuren te implementeren, maar zijn over her algemeen beter bruikbaar als middel om mensen in verwarring te brengen.

In [ruby-talk:4482], geeft Jim Weirich het volgende voorbeeld van continueringen:

   
# --------------------------------------------------------------------
# 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


Vorige
Home Nederlands Volgende