2.29. Ruby

Ruby tilhører, sammen med Perl og Python, gruppen af moderne fortolkede sprog. Fra begyndelsen er Ruby designet som et objektorienteret sprog og giver derfor en mere elegant oplevelse end Perls objekter, men derudover minder Ruby langt hen af vejen om en pænere version af Perl.

Ruby er hovedsagligt udviklet i Japan og meget af dokumentationen er skrevet på japansk. Denne mangel på engelsk dokumentation har været en hindring for Rubys internationale udbredelse. Dette er der ved at blive rådet bod på, det kan derfor kun anbefales at se nærmere på Ruby.

2.29.1. Hej verden!

Vi begynder med det sædvanlige eksempel. Et lille program der ikke gør andet end at skrive "Hello World!" ud på skærmen. Det giver ikke meget indtryk af selve sproget Ruby, men viser hvordan man bruger det. Gem følgende tekst som hello.rb


#!/usr/bin/ruby

print "Hello World!\n"

Programmet kan nu køres ved enten at kalde ruby:


linus% ruby hello.rb
Hello World!
linux% 
eller ved at gøre scriptet udførbart og køre det direkte:

linux% chmod a+x hello.rb
linux% ./hello.rb
Hello World!
linux% 

2.29.2. Et større eksempel

For at vise et lidt større eksempel som giver en lidt større indsigt i hvordan Ruby ser ud er her et simpelt program til afsendelse af email. Programmet er ret simpelt. Det beder om en afsender, en modtager og et emne. Derefter kan man skrive sin mail.

I sin fulde længde ser programmet således ud:


#! /usr/bin/ruby

require 'net/smtp'

mail = ""

begin
  print "From: "
  from = readline
  mail << "From: " << from
  from.chomp!
  print "To: "
  to = readline
  mail << "To: " << to
  to.chomp!
  print "Subject: "
  mail << "Subject: " << readline
rescue EOFError
  print "\nAborted\n"
  exit 1
end

mail << "\n"

print "Write mail end with . or EOF\n"
begin
    line = readline
    break if (line == ".\n")
    mail << line
rescue EOFError
    break
end while true

smtp = Net::SMTP::new("localhost")
smtp.start
smtp.sendmail(mail, from, to)
smtp.finish

Den første linje


require 'net/smtp'
Fortæller at vi har brug for biblioteket der implementerer SMTP så vi kan sende mail.

Selvom Ruby er utypet, så skal vi have et objekt for at kunne lave metodekald. Derfor bliver vi nødt til at initialiserer variablen mail med et streng-objekt:


mail = String::new("")

Det næste vi skal gøre er at spørge brugeren om afsenderen, modtageren og emnet for mailen. Hvis brugeren trykker Ctrl-D (End Of File) skal programmet stoppe:


begin
  print "From: "
  from = readline
  mail << "From: " << from
  from.chomp
  print "To: "
  to = readline
  mail << "To: " << to
  to.chomp
  print "Subject: "
  mail << "Subject: " << readline
rescue EOFError
  print "\nAborted\n"
  exit 1
end

mail << "\n"

readline læser en linje fra standard-ind. Hvis brugeren sender en EOF (trykker Ctrl-D) rejses end EOFError-undtagelse, der derfor fanges tilsidst i blokken (fra rescue EOFError).

<< er en metode på et streng-objekt. Den tilføjer en streng til objektet. chomp-metoden fjerner ny linje-tegnet sidste fra en streng.

Så skal vi læse selve mailen ind. Dette gøres i en uendelig while-løkke:


print "Write mail end with . or EOF\n"
begin
  line = readline
  break if (line == ".\n")
  mail << line
rescue EOFError
  break
end while true

Hvis brugeren sender en EOF hopper vi ud af løkken i rescue-blokken og hvis brugeren skriver en linje kun indenholdende et punktum hopper vi også ud af løkken.

Tilbage er bare at sende mailen:


smtp = Net::SMTP::new("localhost")
smtp.start
smtp.sendmail(mail, from, to)
smtp.finish

Vi laver et smtp-objekt og sender mailen med sendmail-metoden

2.29.3. One-liners i Ruby

ruby understøtter en række argumenter der gør det lettere at skrive one-liners, altså små programmer der kan skrives på en linje. Disse argumenter kendes også fra perl