Programmering i Ruby

Den Pragmatiske Programmerers Veiledning

Forrige < Innhold ^
Neste >

Innledning



Denne boken er en veiledning til og referanse for programmeringsspråket Ruby. Bruk Ruby og du vil skrive bedre kode, være mer produktiv og ha det mer moro når du programmerer.

Dette er vågale påstander, men vi mener at du vil si deg enig i dem, etter å ha lest denne boka. Vi kan nemlig støtte oss på erfaring når vi sier dette.

I vår rolle som Pragmatiske Programmerere har vi prøvd haugevis av språk i vår søken etter verktøy som gjør hverdagen enklere og hjelper oss til å gjøre en bedre jobb. Men inntill nå har vi alltid blitt frustrert av språkene vi brukte.

Vårt arbeid består i å løse problemer, ikke i å mate kompilatorer, så vi liker dynamiske språk som kan tilpasse seg til oss og ikke har vilkårlige, rigide regler. Vi trenger klarhet i koden slik at vi kan bruke den til å kommunisere med. Vi verdsetter kortfattethet og muligheten for å uttrykke et krav i kode på en nøyaktig og effektiv måte. Jo mindre kode vi trenger å skrive, jo mindre ting som kan gå galt. (Også blir det mindre belastning på håndledd og fingre.)

Vi ønsker å være så produktive som mulig, og derfor vil vi at koden skal kjøre med en gang; tid brukt inne i avlusingsverktøy (debugger) stjeles fra tiden vi har til å drive utvikling. En annen ting som hjelper er hvis vi kan prøve ut koden mens vi endrer den; for hvis du må vente for en to timer lang kompilerings- og lenkingssyklus, ja da kan du like godt bruke hullkort og levere arbeidet ditt i en bunke og vente på til neste kompilering kjøres.

Vi ønsker et språk med et høyt abstraksjonsnivå. Jo mer høynivå språket er, jo mindre tid trenger vi på å oversette våre krav til kode.

Da vi oppdaget Ruby innså vi at vår søken var over. I høyere grad enn noe annet språk vi har arbeidet med, så unngår Ruby å gå i veien for arbeidet. Du kan konsentere deg om å løse problemet foran deg, i stedet for å knote med kompilatoren eller språket. Det er dette som gjør at Ruby kan hjelpe deg med å bli en bedre programmerer: ved å gi deg mulighet til å bruke mer av tiden til å løse problemer for brukerne dine, og ikke kompilatoren.

Ruby glitrer

Ta et virkelig objekt-orientert språk, som for eksempel Smalltalk. Kast den uvanlige syntaksen og gå over til mer konvensjonell, filbasert kildekode. Rør inn en god porsjon av de fleksible og praktiske aspektene ved språk som Python og Perl.

Resultatet er Ruby.

De som er glad i objekt-orientering vil finne mye som faller i smak: slik som ren objekt-orientering (alt er et objekt), metaklasser, tillukkinger, iteratorer og allestedsnærværende, heterogene samlinger. Smalltalk-brukere vil føle seg hjemme (og C++ og Java brukere vil føle misunnelse).

Samtidig vil Perl- og Python-trollmenn finne igjen mange av favorittverktøyene deres: full støtte for regulære uttrykk, tett integrering med det underliggende opperativsystemet, praktiske snarveier og dynamisk evaluering.

Ruby er enkelt å lære seg. Dagligdagse oppgaver er enkle å programmere, og når de er gjort, er de enkle å vedlikeholde og videreutvikle. Ting som tilsynelatende er vanskelige, viser seg ofte å ikke være vanskelige i det hele tatt. Ruby følger Prinsippet om den Minste Overraskelse(Principle of Least Surprise)---ting fungerer slik du forventer, med veldig få spesialtilfeller eller unntak. Og dette utgjør virkelig en forskjell når du programmerer.

Vi sier at Ruby er et gjennomsiktig(transparent) språk. Det vi mener, er at Ruby ikke skjuler løsningene du skriver bak en masse syntaks og tonnevis av støttekode bare for å få gjort enkle ting. Med Ruby skriver du programmer nærmere problemdomenet. I stedet for å hele tiden måtte oversette dine ideer og design ned til det kjedelige nivået de fleste språk er på, vil du se at i Ruby kan du uttrykke dem både direkte og på en elegant måte. Det betyr at du programmerer raskere. Det betyr også at programmene dine forblir lesbare og vedlikeholdbare.

Når vi bruker Ruby, blir vi til stadighet overrasket over hvor store mengder kode vi kan skrive sammenhengende, som fungerer fra første gang. Det er få syntaksfeil, ingen problemer med typing og betydelig færre programfeil enn til vanlig. Dette virker fornuftig: det er mindre som kan gå galt. Ingen kjedsommelige semikolon man mekanisk må taste på slutten av hver linje. Ingen kranglete typedeklarasjoner som må synkroniseres (spesielt i separate filer). Ingen unødvendige ord som bare gjør kompilatoren glad. Ikke noe rammeverk som lett feiler.

Så hvorfor burde du lære deg Ruby? Fordi vi mener det vil hjelpe deg til å bli en bedre programmerer. Det vil hjelpe deg til å fokusere på problemet du arbeider på, med færre ting som kan ødelegge konsentrasjonen. Det vil gjøre livet ditt enklere.

Hva slags språk er Ruby?

I gamle dager var det enkelt å skille mellom språk: enten var de kompilerte, slik som C eller Fortran, eller fortolkede, slik som BASIC. Kompilerte språk gav deg hastighet og tilgang til lavnivå konstruksjoner; fortolkede språk var på et høyere nivå men også tregere.

Ting endrer seg over tid, og de er ikke så enkle lengre. Noen språkdesignere har begynt å kalle deres kreasjoner for ``skriptspråk.'' Med dette antar vi at de mener at språkene deres er fortolkede og kan brukes som erstatning for batchfiler og skallskript, slik at det samordner oppførselen til andre programmer og det underliggende systemet. Perl, TCL og Python har alle sammen blitt kalt skriptspråk.

Nøyaktig hva er et skriptspråk? Ærlig talt så vet vi ikke om det er et skille som er verdt å trekke. I Ruby har du tilgang til alle fasilitene i det underliggende operativsystemet. Du kan gjøre akkurat de samme tingene i Ruby som du gjør i Perl eller Python, og på en renslig måte. Men Ruby har også fundamentale forskjeller. Det er også et ordentlig programmeringsspråk, med sterke teoretiske røtter og en elegant, lettvint syntaks. Du kan rable sammen et rotete sammensurium av ``skript'' i Ruby, men vil sannsynligvis ikke gjøre det. I stedet vil du være mer disponert til å konstruere en løsning, til å lage et program som er enkelt å forstå, enkelt å vedlikeholde og barnemat å utvide og gjenbruke i fremtiden.

Selv om vi har brukt Ruby for å skrive skript, bruker vi det som oftest som et generelt programmeringsspråk. Vi har brukt det til å skrive applikasjoner med grafiske brukergrensesnitt og mellomlags serverprosesser, og vi bruker det til å formatere store deler av denne boka. Andre har brukt det for å håndtere servere og databaser. Ruby serverer websider, snakker med databaser og genererer dynamisk innhold. Noen skriver programmer med kunstig intelligens og maskinlæring i Ruby, og minst en person bruker det for å utforske naturlig evolusjon. Ruby finner seg et hjem som et verktøy for utforskende matematikk. Og folk over hele verden bruker det til å koble sammen flere forskjellige applikasjoner. Det er virkelig et storslagent språk for å lage løsninger i et bredt spekter av problemdomener.

Er Ruby noe for meg?

Ruby er ikke en universal patentløsning for problemer programmerere står ovenfor. Til tider vil du trenge et spesielt språk: kanskje omgivelsene dikterer det, du trenger kanskje spesielle bibliotek, du har ytelseskrav eller ganske enkelt begrenses av tilgang på opplæring. Vi har ikke gitt fullstendig opp språk som Java og C++ (selv om vi til tider ønsker at vi kunne).

Men Ruby er antagelig mer anvendelig enn du tror. Det er enkelt å utvide Ruby, både fra inne i selve språket og ved å lenke inn biblioteker fra tredjeparter. Det er portabelt på tvers av en rekke plattformer. Det er relativt lightweight og spiser opp en beskjeden mengde ressurser. Og det er enkelt å lære; vi kjenner folk som har begynt å bruke Ruby i systemer som er i produksjon innen en dag etter at de fikk tak i et utkast av denne boka. Vi har brukt Ruby til å implementere deler av en X11 vindushåndterer, en oppgave som vanligvis innebar mye C koding. Ruby utmerket seg og i løpet av noen timer hadde vi skrevet kode som ellers ville ha tatt flere dager.

Når du har blitt komfortabel med å bruke Ruby, tror vi det vil bli favorittspråket ditt.

Hvorfor skrev vi denne boka?

Vi hadde nettopp gjort ferdig forrige bok, The Pragmatic Programmer, familiene våre hadde akkurat begynt å snakke med oss igjen og plutselig følte vi et behov for å skrive enda en bok. Hvorfor? Vi gjetter på at det koker ned til en slags misjonær nidkjærhet.

Ruby ble laget av Yukihiro Matsumoto (Matz) i Japan. Siden 1995 har Ruby sin popularitet i japan vokst med en overveldende fart; det går rykter om at Ruby er mer populært enn Python i Japan. Men til dags dato, er mye av den detaljerte dokumentasjonen om Ruby skrevet på japansk. Det er sannsynligvis ikke et programmeringsspråk du bare tilfeldigvis kommer borti.

Vi ønsket å spre kjennskapen, få flere folk utenfor Japan til å bruke Ruby og nyte fordelene, så vi bestemte oss for å dokumentere Ruby på engelsk. Og det som startet som et lite prosjekt, vokste og vokste...

Ruby versjoner

Denne boken dokumenterer versjon 1.6 av Ruby, som ble sluppet i september 2000.

Versjonsnummereringen til Ruby følger samme opplegget som mange andre åpen kildekode (open source) prosjekter benytter. Utgivelser med partall i underversjonen (1.0, 1.2, 1.4 og så videre) er stabile, offentlige utgivelser. Det er disse utgivelsene som ferdigpakkes og gjøres tilgjengelig på forskjellige Ruby websider.

Utviklingsversjoner av programvaren har oddetall i underversjoen, slik som 1.1 og 1.3. Disse må du laste ned og kompilere selv, som beskrevet i boksen på side xxvii(??).

Installere Ruby

Du kan hente Ruby fra ftp://ftp.netlab.co.jp/pub/lang/ruby, eller et av stedene, nevnt på side 532 i vedlegg C, som speiler Ruby. Der vil du finne den siste stabile utgivelsen, samt forskjellige versjoner under utvikling.

Du vil alltid finne utgivelser av Ruby sin kildekode, men du kan også finne ferdigkompilerte binærfiler for Windows og andre operativsystemer (slik som den binære distribusjonen av Ruby for Window på http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html).

Litt på siden: Den aller nyeste versjonen av Ruby

For de som bare må ha det aller nyeste og holde seg på den utestede, eksperimentelle fronten av teknologien (slik som oss mens vi skrev denne boka), så kan man få utviklingsversjoner direkte fra utviklernes felles arbeidsområde.

Utviklerne bak Ruby bruker CVS (Concurrent Version System, fritt tilgjengelig fra http://www.cvshome.com) for versjonskontroll. Du kan sjekke ut filer som en anonym bruker fra deres arkiv ved å kjøre følgende CVS kommandoer:

% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   login
(Logging in to anonymous@cvs.netlab.co.jp)
CVS password: guest
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   checkout ruby

Hele kildekodetreet, akkurat i den stand utviklerne sist forlot det, vil nå bli kopiert til en underkatalog på din maskin kalt ``ruby'', og oppdaterer ditt lokale kildekodetre fra et lager på den andre siden av kloden. Er det ikke en fantastisk tid vi lever i?

Kompilering av Ruby

Inne i den distribusjonen av Ruby du henter ned, vil du finne en README fil, som forklarer innstallasjonsprosessen i stor detalj. Kort fortalt bygger du Ruby på POSIX-baserte systemer ved å bruke de samme fire kommandoene som for de fleste andre programmer med åpen kildekode: ./configure, make, make test, og make install. Du kan også bygge Ruby i andre omgivelser (inkludert Windows) ved å bruke et miljø som emulerer POSIX, slik som cygwin [Gå til http://sourceware.cygnus.com/cygwin for detaljer om cygwin. ] eller ved å bruke kompilatorer knyttet til den underliggende arkitekturen---ta en titt på ``ntsetup.bat'' i win32 katalogen i distribusjonen for å komme i gang.

Kjøring av Ruby

Nå som Ruby er installert, har du sikkert lyst til å kjøre et par programer. I motsetning til kompilerte programmeringsspråk, er det to måter å kjøre Ruby---interaktivt og som et program.

Interaktiv Ruby

Den enkleste måten å kjøre Ruby interaktivt er å skrive ``ruby'' på kommandolinjen i et skall.

% ruby
puts "Hello, world!"
^D
Hello, world!

Her har vi tastet inn et kall til puts, en tekststreng og et EOF-tegn (EOF står for end-of-file, og var control-D på vårt system). Dette fungerer, men er håpløst hvis du gjør en feil og det er vanskelig å se hva som foregår mens du skriver.

I katalogen sample i Ruby distribusjonen finnes et skript med navn ``eval.rb''. Det tar oss et steg videre, og viser oss verdien til hvert uttrykk etterhvert som vi taster dem inn:

% cd sample
% ruby eval.rb
ruby> a = "Hello, world!"
"Hello, world!"
ruby> puts a
Hello, world!
nil
ruby> ^D
%

Her kan vi se hva som kommer ut til skjermen av puts, samt returverdien fra puts (som er nil).

Dette er jo kjekt nok, men uttrykk over flere linjer fungerer ikke og du kan ikke endre linjen du er på, eller gå tilbake i historikken og bruke tidligere linjer (slik som du kan i et skall).

Hakket bedre enn eval.rb, er irb---Interaktiv Ruby. irb er et Ruby skall, fullstendig med historikk over kommandolinjer, muligheter for å endre linjer og jobbkontroll. Det har så mange konfigurasjonsmuligheter at det har fått et eget vedlegg som starter på side 523. Vi anbefaler at du gjør deg kjent med irb slik at du kan prøve ut noen av eksemplene våre interaktivt.

Ruby programmer

Til sist kan du også kjøre et Ruby program fra en fil slik som du kan med ethvert annet skallskript, Perl- eller Python-program. Du bare kjører Ruby med filnavnet til skriptet som argument:

% ruby myprog.rb

Ellers kan du også bruke Unix sin ``shebang'' (skigard-utropstegn) notasjon i første linje av programfilen. [Hvis systemet ditt støtter det, kan du unngå å hardkode stien til Ruby i shebang-linjen ved å bruke #!/usr/bin/env ruby, som vil søke i programstien din etter hvor ruby er, før ruby kalles. ]

#!/usr/local/bin/ruby -w

puts "Hello, World!"

Hvis du gjør kildekodefilen kjørbar (for eksempel via chmod +x myprog.rb), kan du i Unix kjøre filen som et program:

% ./myprog.rb
Hello, World!

Du kan gjøre noe lignende i Microsoft Windows ved hjelp av filassosiasjoner.

Ressurser

Ta en tur ut på Ruby stedene på verdensveven, http://www.rubycentral.com og http://www.ruby-lang.org, for å finne ut hva siste nytt er, og snakk med andre Ruby-brukere på nyhetsgruppen eller mailinglistene (se vedlegg C).

Vi vil også gjerne høre fra deg. Kommentarer, forslag, feil i boka og problemer med eksemplene er alltids velkomne. Send e-post til oss på:

mailto:rubybook@pragmaticprogrammer.com

Hvis du forteller oss om feil du finner i boka, vil vi legge dem til erratalisten her:

http://www.pragmaticprogrammer.com/ruby/errata/errata.html

Helt til slutt, så finner du all kildekode til nesten alle eksemplene i boken, organisert etter sidetallet, på http://www.pragmaticprogrammer.com/ruby.

Takk og anerkjennelse

Å skrive en bok er et stort arbeid, som vi aldri ville ha klart å fullføre uten hjelp i fra alle vennene våre, gamle og nye. Vi er stolte over å kunne kalle teamet på Addison-Wesley for gamle venner: Mike Hendrickson, John Fuller, den alltids hjelpsomme Julie Steele, og den vidunderlige Julie DiNicola. Takk til dere alle sammen.

Våre anmeldere var fantastiske. Vi gav dem noen utrolige stramme tidsrammer og de sviktet oss ikke. Å anmelde en bok stappfull med tekniske detaljer er ingen enkel jobb, så vi er spesielt takknemlige ovenfor George Coe, Bob Davison, Jeff Deifik, Hal Fulton, Tadayoshi Funaba, Clemens Hintze, Kazuhiro Hiwada, Kikutani Makoto, Mike Linksvayer, Aleksi Niemelä, Lew Perin, Jared Richardson, Armin Roehrl, Conrad Schneiker, Patrick Schoenbach, og Eric Vought. Takk også til de to Julie'ene ved Addison-Wesley for koordineringen av dette virkelig internasjonale prosjektet.

Flere mennesker har hjulpet oss med spesifikke deler av denne boken Tadayoshi Funaba vekslet store mengder e-post med oss helt til vi tilslutt forstod Date modulen. Guy Decoux og Clemens Hintze svarte tålmodig på våre spørsmål om hvordan skrive utvidelser til Ruby, og Masaki Suketa hjalp oss med å forstå WinOLE modulen.

Selv om mye av den opprinnelige Ruby dokumentasjonen er på japansk, er det en stadig voksende mengde engelske oversettelser, hvor mesteparten startes av japanske utviklere med engelskkunnskaper som ikke slutter å overraske oss. Til tross for at det er for mange individuelle bidrag til å kunne navngi dem alle, vil vi gjerne gjøre oppmerksom på Goto Kentaro, som har produsert et stort volum av dokumentasjon med høy kvalitet og lagt det på nettet.

Helt til slutt må vi takke Yukihiro ``Matz'' Matsumoto, som laget Ruby. Vi har mistet tellingen over alle de spørsmål vi har sendt ham og de tålmodige og detaljerte svarene han har sendt tilbake. I tillegg til å lage et virkelig vidunderlig språk, har Matz fostret fram en utrolig støttende og åpen kultur som språket kan blomstre i.

Takk til dere alle. Domo arigato gozaimasu.

Dave Thomas og Andy Hunt
THE PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com

Konvensjoner for notasjon

Gjennom hele denne boken vil vi bruke følgende typografiske notasjoner.

Ordrette kodeeksempler vises med en skrivemaskin-lignende font:

class SampleCode
  def run
    #...
  end
end

Inne i selve teksten, er Fred#doIt en referanse til en instansmetode (doIt) i klassen Fred, mens Fred.new [ I annen Ruby dokumentasjon vil du muligens komme over klassemetodser skrevet som Fred::new. Dette er helt lovlig Ruby syntaks; vi føler bare at Fred.new er mindre distraherende når man leser. ] er en klassemetode, og Fred::EOF er en konstant i en klasse.

Boken inneholder mange Ruby kodebiter. Hvor det har vært mulig, har vi forsøkt å vise hva som skjer når de kjøres. I enkle tilfeller viser vi verdien av uttrykket på samme linje som uttrykket. For eksempel:

a = 1
b = 2
a + b » 3

Til tider vil vi også være interessert i verdiene til tilordninger, og vise dem også.

a = 1 » 1
b = 2 » 2
a + b » 3

Hvis programmet produserer mer komplisert utput, viser vi det under programkoden:

3.times { puts "Hello!" }
produserer:
Hello!
Hello!
Hello!

I deler av biblioteksdokumentasjonen ønsker vi å vise hvor mellomrom forekommer i utput. Disse mellomrom-tegnene vil vises som ``[visible space]''.

Kall gjort på kommandolinjen vises med ordrett tekst i en Roman font, og parametre i kursiv. Valgfrie elementer vises i store hakeparenteser.

ruby [
            flags
            ]*
             [
            progname
            ] [
            arguments
            ]+
            

( In progress translation to Norwegian by NorwayRUG. $Revision: 1.14 $ )
$Log: preface.xml,v $
Revision 1.14  2003/01/19 18:34:36  kent
Lenke til vedlegg C.

Revision 1.13  2003/01/19 14:49:21  kent
Lenke inn sidebar og fikse skigard.

Revision 1.12  2003/01/19 10:53:23  kent
Igjennomgang med fiksing av endel småplukk.
Usikker på endel ord deling skal være orddeling eller ord-deling.


Forrige < Innhold ^
Neste >

Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide".
Translation to norwegian by Norway Ruby User Group.
Copyright for the english original authored by David Thomas and Andrew Hunt:
Copyright © 2001 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/).

(Please note that the license for the original has changed from the above. The above is the license of the original version that was used as a foundation for the translation efforts.)

Copyright for the norwegian translation:
Copyright © 2002 Norway Ruby User Group.
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.