Next Previous Contents

2. Vår første smakebit av Ruby-kode.

Eksemplene vises med linjenummer. (Disse er ikke en del av kildekoden!)
Det vil si, når det står

    12| puts "Hello"

er det
    puts "Hello"
som er kildekoden.

Kodelinjer er ofte annotert med en kommentar: #=>
som viser hva resultatet vil bli eller hva som skrives ut. Ett eksempel:

    5 + 2 #=> 7

2.1 Hei verden!

Hello World begynner å bli gammel og tynnslitt, så her har vi en litt mer komplisert variant:

  1| # Ett klassisk eksempel
  2| class Verden             # Definer en klasse...
  3|   def si_hei             # med en metode...
  4|     puts 'Hei verden!'   # som skriver ut litt tekst.
  5|   end
  6| end
  7| 
  8| verden = Verden.new      # Lag en instans av klassen.
  9| verden.si_hei            # Kall en metode på objektet.

Kjøre heiverden1.rb

Det er flere måter å kjøre Ruby-kode på, bl.a.:

2.2 Variabler

I Ruby har ikke en variabel noen statisk type. En variabel er bare et navn man forbinder med en referanse til et objekt. (Dette er den korte forklaringen på hva dynamisk typing er.)

  1| x = 'Norge'  # Se, jeg er en tekst-streng (String).
  2| x = [1,2,3]  # Øh, jeg mener en Array.
  3| x = 5        # Ups, nå er jeg en Fixnum.
  4| 
  5| # Tilordninger kan lenkes
  6| a = b = c = d = 5
  7| 
  8| # Du trenger ikke ekstra variable for å bytte to verdier
  9| x = 5
 10| y = 3
 11| x, y = y, x  # Nå er x = 3 og y = 5
 12| 
 13| # Denne er kjekk å ha når en metode vil returnere flere verdier
 14| a,b,c = ['a','b','c']
 15| 
 16| # Ruby bruker prefiks for å angi variabel skop
 17| $global_variabel   = 'alle kan se meg!'
 18| lokal_variabel     = 'sånn som x, y, a, b, c etc.'
 19| @instans_attributt = 'jeg tilhører det gjeldende objekt.'
 20| @@klasse_attributt = 'jeg er felles for mange objekter.'
 21| KONSTANT_VARIABEL  = 'en selvmotsigelse?'

Attributter kalles også instansvariable eller felt.

Enhver variabel som begynner med stor forbokstav er konstant i Ruby. Konstant vil si at variabelreferansen er konstant, ikke at objektet ikke kan endre tilstand. (Ønsker du sistnevnte, prøv freeze)

2.3 Tekststrenger

Vi kunne ikke skrive ut "Hei verden!" uten å ha litt tekst.
I Ruby er tekststrenger instanser av klassen String.

  1| # String objekter kan instansieres
  2| navn = String.new("Ruby") # veldig eksplisit, eller
  3| navn = "Ruby"             # implisitt
  4| 
  5| # Tekst kan adderes...
  6| fornavn   = 'Ola'
  7| etternavn = 'Nordmann'
  8| fullt_navn = etternavn + ', ' + fornavn 
  9| puts fullt_navn #=> "Nordmann, Ola"
 10| 
 11| #...multipliseres...
 12| "Ah!" * 2 + " Tsjo!" #=> "Ah!Ah! Tsjo!"
 13| 
 14| #...manipuleres...
 15| "Karakter fire".sub("fire", "en") #=>"Karakter en"
 16| "14.99".to_f #=> 14.99
 17| 
 18| #...inspiseres...
 19| "TEAMWORK".include?("I")  #=> false
 20| "Kulturuke".index("tur")  #=> 3 

Legg merke til at man kan skrive strenger både "slik" (med kråketær) og 'slik' (med apostrof). Disse to versjonene er ikke bare for syns skyld.

Mer om String

String-klassen i Ruby fungerer ikke slik som Java sin String-klasse, hvor man ikke kan endre et strengobjekt.

  1| # String objekter kan endres:
  2| navn = "Ola Nordmann"
  3| 
  4| # Kjønnsoperasjon?
  5| nyttnavn = navn.sub("Ola", "Oline")
  6| 
  7| # sub lager ett nytt String objekt.
  8| puts nyttnavn #=> "Oline Nordmann"
  9| puts navn     #=> "Ola Nordmann"
 10| 
 11| # sub! (sub-bang) endrer selve streng objektet
 12| nyttnavn = navn.sub!("Ola", "Oline")
 13| puts nyttnavn #=> "Oline Nordmann"
 14| puts navn     #=> "Oline Nordmann"

Legg merke til at sub generer et helt nytt String-objekt, mens sub! endrer det faktiske objektet.
Metoder som slutter med utropstegn kalles "bang", "mutator" eller "destruktive" metoder, da de som oftest endrer objektet.
Ruby bruker denne konvensjonen for navngivelse på mange metoder, men er ikke påkrevd.
Noen metoder slutter også på spørsmålstegn (e.g. empty?) for å indikere at de returnerer true/false.

Skrive ut tekst

Det er mer enn en måte å flå en katt på, og der er også mer enn en måte å skrive ut tekst i Ruby.

  1| # Tekst kan skrives ut
  2| navn = 'Finn'
  3| puts 'Jeg heter ' + navn
  4| 
  5| # Liker du ikke puts?
  6| print "Jeg heter " + navn + ".\n"
  7| 
  8| # Liker du C?
  9| printf "Jeg heter %s!\n", navn
 10| 
 11| # Forelska i C++?
 12| STDOUT << "Ikke Bjarne... " <<
 13|   "Ikke Jan-Thomas... " <<
 14|   "Jeg heter " << navn << "!!!\n"
 15| 
 16| # Tekst-streng interpolering.
 17| puts "Jeg heter fremdeles #{navn}"
 18| puts "Jeg blir #{Time.now.year-1978} år i år"

Her ser vi hvorfor vi både bruker "kråketær" og 'apostrof' for å angi tekststrenger. Med kråketær kan vi escape tegn (slik som \n som betyr ny linje), og kjøre Ruby uttrykk inne i tekststrengen.

2.4 Tall.

Selv om tall også er objekter i Ruby, oppfører de seg normalt, og du må ikke vri hjernen din rundt sær syntaks.

  1| # Heltall
  2| a = 3
  3| b = 2
  4| c = a + b    #=> 5
  5| d = c / b    #=> 2
  6| 
  7| # Flyttall
  8| f = c.to_f / b #=> 2.5
  9| 
 10| # Tall er også objekter
 11| puts "tre og to er " + c.to_s
 12| -25.abs     #=> 25
 13| a.zero?     #=> false
 14| 0.zero?     #=> true
 15| a.next      #=> 4 

Ruby har flere tallklasser:

Men du trenger ikke å tenke så mye på dem. Dersom du gjør noe med Fixnum som blir for stort, får du automatisk en Bignum ut. Du slipper å tenke på overflyt. Flyttall er derimot like unøyaktige som i de fleste språk og avrundingsproblematikk slipper du ikke unna.
For å lagre brøker, kan du bruke Rational-klassen. ( require 'rational' )

to_s

to string - lag en tekstlig representasjon av objektet, ikke ulikt Java sin toString().


Next Previous Contents