Eksemplene vises med linjenummer. (Disse er ikke en del av kildekoden!)
Det vil si, når det står
12| puts "Hello"
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
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. |
Det er flere måter å kjøre Ruby-kode på, bl.a.:
ruby heiverden1.rb
irb
irb(main):001:0> load "heiverden1.rb"
Hei verden!
true
heiverden1.rb
filen.
#!/usr/bin/env ruby
chmod a+x heiverden1.rb
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
)
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.
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.
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.
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:
Fixnum
- begrenset heltallBignum
- ubegrenset heltall (forutsatt uendelig minne ;-)Float
- flyttall med begrenset presisjonFixnum
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. Rational
-klassen. ( require 'rational'
)
to string - lag en tekstlig representasjon av objektet, ikke ulikt Java sin toString()
.