8. Lær at programmere:

Skriv dine egne metoder 

Skriv dine egne metoder 

 Som vi har set tillader sæt og gentagere os at gøre den samme ting (køre den samme kode) igen og igen. Nogle gange kunne vi dog godt tænke os at gøre den samme handling flere gange, men fra forskellige steder i programmet. For eks lad os sige at vi ville skrive et spørgeskema for  en psykologistudent. Ud fra de psykologistuderende jeg har kendt, og det de har vist mig, vil den måske se nogenlunde sådan ud:


puts 'Hej og tak for at du vil være med til at'
puts 'hjælpe mig med dette forsøg. Mit forsøg'
puts 'undersøger hvad folk synes om '
puts 'mexikansk mad. Prøv bare at tænke på mexikansk  mad '
puts 'og forsøg så at besvare hvert spørgsmål ærligt'
puts 'enten med et "ja" eller  et "nej". Mit forsøg'
puts 'har ikke noget at gøre med at tisse i bukserne'
puts

#  Vi stiller spørgsmålene men vi svarene

godtSvar = false
while (not godtSvar)
  puts 'Kan du li tacos?'
  svar = gets.chomp.downcase
  if (svar == 'ja' or svar == 'nej')
    godtSvar = true
  else
    puts 'Vær venlig at svare  "ja" or "nej".'
  end
end

godtSvar = false
while (not godtSvar)
  puts 'Kan du li  burritos?'
  svar = gets.chomp.downcase
  if (svar == 'ja' or svar == 'nej')
    godtSvar = true
  else
    puts 'Vær venlig at svare  "ja" or "nej".'
  end
end

#  Vi giver opmærksomhed til dette svar

godtSvar = false
while (not godtSvar)
  puts 'Tisser du i sengen?'
  svar = gets.chomp.downcase
  if (svar == 'ja' or svar == 'nej')
    godtSvar = true
    if svar == 'ja'
      tisserISengen = true
    else
      tisserISengen = false
    end
  else
    puts 'Vær venlig at svare  "ja" or "nej".'
  end
end
godtSvar = false
while (not godtSvar)
  puts 'Kan du li  chimichangas?'
  svar = gets.chomp.downcase
  if (svar == 'ja' or svar == 'nej')
    godtSvar = true
  else
    puts 'Vær venlig at svare  "ja" or "nej".'
  end
end

puts 'Just a few more questions...'
puts ' Så er der bare nogle få spørgsmål tilbage...'

godtSvar = false
while (not godtSvar)
  puts 'Kan du li  sopapillas?'
  svar = gets.chomp.downcase
  if (svar == 'ja' or svar == 'nej')
    godtSvar = true
  else
    puts 'Vær venlig at svare  "ja" or "nej".'
  end
end

#  Stil en masse andre spørgsmål om mexikansk mad

puts
puts 'EVALUERING:'
puts 'Tak fordi du brugte din tid på at hjælpe med'
puts 'dette forsøg. Faktisk handlede dette forsøg'
puts 'overhovedet ikke om mexikansk mad. Det er'
puts 'et forsøg om at tisse i sengen. Den mexikanske'
puts 'mad var bare med for at få dig til at slappe af.'
puts 'Så tror vi du vil svare mere ærligt.'
puts 'Tak en gang til'
puts
puts tisserISengen
Hej og tak for at du vil være med til at
hjælpe mig med dette forsøg. Mit forsøg
undersøger hvad folk synes om
mexikansk mad. Prøv bare at tænke på mexikansk  mad
og forsøg så at besvare hvert spørgsmål ærligt
enten med et "ja" eller  et "nej". Mit forsøg
har ikke noget at gøre med at tisse i bukserne

Kan du li tacos?
ja
Vær venlig at svare  "ja" or "nej".
Kan du li tacos?
ja
Kan du li  burritos?
ja
Tisser du i sengen?
ja
Kan du li  chimichangas?
ja
Just a few more questions...
 Så er der bare nogle få spørgsmål tilbage...
Kan du li  sopapillas?
ja

EVALUERING:
Tak fordi du brugte din tid på at hjælpe med
dette forsøg. Faktisk handlede dette forsøg
overhovedet ikke om mexikansk mad. Det er
et forsøg om at tisse i sengen. Den mexikanske
mad var bare med for at få dig til at slappe af.
Så tror vi du vil svare mere ærligt.
Tak en gang til

true 

Det var et temmeligt langt program med en masse gentagelser. (Alle de dele af programmet der indeolder noget om mexikansk mad er identiske og afsnittet om at tisse i sengen var bare en smule ændret). Gentagelser er noget bras. Og dog kan vi ikke lave det til et sæt eller en gentager, fordi vi nogle gange gerne vil lave noget imellem spørgsmålene. I sådanne situationer er det bedst at skrive en metode selv. Her er hvordan man gør det:


def sigMuh
  puts 'muuuuuuu...'
end


...no output ...

Øh... vores program sagde ikke 'muuuuuu ...' Hvorfor ikke ? Fordi vi ikke bad den om det. Vi fortalte hvordan den skulle sigHuh men vi sagde det i virkeligheden aldrig. Lad os prøve igen.


def sigMuh
  puts 'mooooooo...'
end

sigMuh
sigMuh
puts 'duck - duck'
sigMuh
sigMuh



mooooooo
mooooooo
duck - duck
mooooooo
mooooooo


Ah... det var bedre (Bare lige hvis du ikke taler fransk - det er hvad franske ænder siger--- "duck - duck")

Så vi definerede metoden sigMuh (metodenavne starter ligesom variabel navne med lille bogstav. Der er dog nogle få undtagelser såsom + og == )
Men er metoder ikke altid forbundne med objekter? Jo, de er, og i denne situation (som med puts og gets ) er metoderne bare forbundne med det objekt der representerer hele programmet. I det næste kapitel vil vi se hvordan man kan lægge metoder til andre objekter. Men først...


Method Parameters

 Du har måske bemærket at nogle metoder (som fx gets, to_s, reverse ...)  bare kan kaldes på et objekt. Men andre metoder ( som f.eks +, og - ) kræver parametre for at fortælle objektet hvordan man skal udføre metoden. For eks. man kan ikke bare sige 5+, vel? Du beder 5 om at lægge noget til, men du fortæller ikke hvad der skal lægges til.

For at lægge en parameter til sigMuh (lad os sige, antallet af Muh'er ) ville vi gøre sådan her:


def sigMuh antalMuh
  puts 'muhhhhhh...'*antalMuh
end


sigMuh  3
puts 'øf øf'
sigMuh  # Dette ville give en fejl fordi parameteren mangler


muhhhhhh...muhhhhhh...muhhhhhh...
øf øf
#<ArgumentError: wrong number of arguments (0 for 1)>


 antalMuh er en variabel som peger på parameteren der sættes ind. Jeg siger det lige igen, for det er en smule forvirrende. antalMuh er en variabel som peger på parameteren som sættes ind. Så hvis jeg skriver sigMuh 3, så er parameteren 3 og variabelen antalMuh peger på 3

Som du kan se, er parameteren nu krævet. Hvad skulle sigMuh ellers gange 'muhhhh...' med hvis du ikke giver den en parameter? Din stakkels computer aner det ikke.

Hvis objekter i ruby er som navneord på dansk, og metoderne er som udsagnsord, så kan du tænke parameterne som biord (som med sigMuh, hvor parameteren hvordan vi skulle sige sigMuh) eller nogle gange det direkte genstandsled (som med puts, hvor parameteren er hvad der bliver puts'et).

Lokale variable:


 I det følgende program er der 2 variable:
 

def fordobbelDette tal
  antalgange2 = tal*2
  puts tal.to_s+' fordoblet er   '+antalgange2.to_s
end

fordobbelDette 44

44 fordoblet er 88

variablene er 'tal' og 'antalgange2'. De er begge indeni metoden fordobbelDette. De (og alle de andre variable som du indtil nu har set) er lokale variable. Det betyder at de lever inden i metoden og kan ikke komme ud. Hvis du prøver, får du en fejl:



fordobbelDette tal
  antalgange2 = tal*2
  puts tal.to_s+' fordoblet er   '+antalgange2.to_s
end

fordobbelDette 44
puts antalgange2.to_s


44 fordoblet er 88
#<NameError: undefined local variable or method `antalgange2' for #<StringIO:0x82ba924>>


Ikke defineret lokal variabel (Undefined local variable)...
Faktisk definerede vi den lokale variabel, men den er ikke lokal på det sted hvor vi forsøgte at bruge den. Den er lokal inden i metoden.

Det ser måske besværligt ud, men det er faktisk rart nok. Selvom det betyder at du ikke har adgang til variable inden i metoder, betyder det også at de ikke har adgang til dine variable og således ikke kan forpurre dem

def lilleSkadedyr var
  var = nil
  puts "HA HA! Jeg har ændret din variabel"
end

var = "Du kan ikke goere noget ved min variabel"
lilleSkadedyr var
puts var

HA HA! Jeg har ændret din variabel
Du kan ikke goere noget ved min variabel


Der er faktisk to variable med navnet var i dette lille program: en inden i lilleSkadedyr og en udenfor det. Når vi kalder 'lilleSkadedyr var' overfører vi faktisk bare strengen fra den ene 'var' til den anden, så begge to peger på den samme streng. Derefter satte  lilleSkadedyr dens egen 'var' til nil, men det forandrede ikke noget udenfor metoden.

 Retur værdier

Du har måske opdaget at nogle metoder giver noget tilbage når du kalder dem. For eksempel returnerer  'gets' en streng (den streng som du tastede ind) og + metoden i 5 + 3 (som faktisk er 5.+(3)) returnerer 8. Regnemetoder for tal returnerer tal, og regnemetoder for strenge returnerer strenge.

Det er vigtigt at forstå forskellen mellem metoder der returnerer en værdi til den der kalder den  og det at dit program skriver noget information ud på skærmen, som for eksempel puts gør. Bemærk at 5 + 3 returnerer 8. Men den skriver ikke 8 på skærmen.

 Så hvad mon 'puts' returnerer? Det har endnu ikke bekymret os, men lad os se på det:

returnVal = puts 'Denne puts returnerede: :'
puts returnVal


Denne puts returnerede:
nil


Så den første puts returnerede nil. Selvom vi ikke testede den anden, gjorde den det samme. 'puts' returnerer altid nil. Alle metoder returnerer noget. om så det bare er nil.
Tag en kort pause og skriv et program der finder ud af hvad sigMuh returnerede.


Blev du overrasket? Nu skal du se hvordan det virker: den værdi der bliver returneret fra en metode er den sidste linie i metoden. I sigMuh betyder det at den returnerer  puts 'muhhhhhh...'*antalMuh' som jo bare er nil fordi puts altid returnerer nil. Hvis vi gerne ville have alle vores metoder til at returnere strengen 'Yellov submarine' skulle vi bare sætte det i sidste linie af dem:

def sigMuh antalMuh
  puts 'muhhhhhh...'*antalMuh
  "yellow submarine"
end

x = sigMuh 2
puts x


muhhhhhh...muhhhhhh...
yellow submarine


Så lad os lave vores psykologi forsøg en gang til, men denne gang vil vi skrive en metode som laver spørgsmålene for os. Den skal tage spørgsmålet som parameter og returnere true hvis man svarer ja og false hvis man svarer nej. (Selv om vi i de fleste af spørgsmålene bare ignorerer svaret, er det stadig en god ide at vores metode returnere svaret. På denne måde kan vi bruge den til vores senge-tisse spørgsmål.)Jeg vil også forkorte start hilsnen og den afsluttende forklaring bare så det er lettere at læse:


def ask mintekst
  godtSvar = false
  while (not godtSvar)
    puts mintekst
    svar = gets.chomp.downcase
   
    if (svar == 'ja' or svar == 'nej')
      godtSvar = true
      if svar == 'ja'
        retur_svar = true
      else
        retur_svar = false
      end
    else
      puts 'Svar venligst"ja" or "nej".'
    end
  end
 
  retur_svar  #  Det er hvad vi returnerer (true eller false)
end


puts 'Hej og tak fordi du vil være med i denne...'
puts

ask 'Kan du li tacos?'      #  Vi ignorerer denne værdi.
ask 'Kan du li burritos?'
wetsBed = ask 'Tisser du i sengen?'  #  Vi gemmer denne værdi.
ask 'Kan du li chimichangas?'
ask 'Kan du li sopapillas?'
ask 'Kan du li tamales?'
puts 'Så er der bare nogle få spørgsmål tilbage ...'
ask 'Kan du lide at drikke horchata?'
ask 'Kan du li flautas?'

puts
puts 'DEBRIEFING:'
puts 'Tak fordi du ...'
puts
puts wetsBed



Kan du li tacos?
ja
Svar venligst"ja" or "nej".
Kan du li tacos?
ja
Kan du li burritos?
ja
Do you wet the bed?
ja
Kan du li chimichangas?
j
Svar venligst"ja" or "nej".
Kan du li chimichangas?
ja
Svar venligst"ja" or "nej".
Kan du li chimichangas?
ja
Svar venligst"ja" or "nej".
Kan du li chimichangas?
ja
Kan du li sopapillas?
ja
Kan du li tamales?
ja
Så er der bare nogle få spørgsmål tilbage ...
Kan du lide at drikke horchata?
ja
Kan du li flautas?
ja

DEBRIEFING:
Thank you for...

true

Ikke så dårligt, hva? Vi kunne lave 2 spørgsmål mere (og nu er det let at lave nye spørgsmål ) men vores program er en hel del mindre. Det er en stor forbedring - en doven programmørs  drøm.

Endnu et stort eksempel


Jeg tror endnu et eksempel vil være en god hjælp her. Vi vil kalde denne metode for talpaaDansk. Den vil tage et tal, for eksempel 32, og returnere den danske version af det (i dette tilfælde 'toogtredve'). Indtil videre vil vi kun lave den med tal op fra nul til hundrede.

(Note: Denne metode bruger  et nyt trick til at returnere fra en metode, ved at bruge nøgleordet 'return', og det introducerer en ny måde at lave en gren mere på: elseif. Det burde være klart fra konteksten hvordan de virker.)

def danskeTal  voresTal
  #  Vi ønsker kun tal fra  0-100.
  if voresTal < 0
      return 'Vær venlig at bruge nul eller større tal'
  end
  if voresTal > 100
    return 'Brug venligst tallet 100 eller mindre.'
  end
  numStreng = ''  #  Dette er strengen vi vil returnere.
  #  
  #  "tilbage" er hvormeget af tallet der stadig har tilbage til at skrives ud.
  #  "skrives" er den del som vi skriver ud lige nu.
  #  skrives og tilbage... forstået?  :)
  tilbage  = voresTal
  skrives = tilbage/100          #  Hvor mange hundreder skrives ud?
  tilbage  = tilbage - skrives*100  #  Træk de hundreder fra.
  if skrives > 0
    return 'et hundrede'
  end
  puts "tilbage: " +  tilbage.to_s +  ". skrives: " +  skrives.to_s
 
  skrives = tilbage/10          #  Hvor mange tiere er tilbage skrives ud?
  tilbage  = tilbage - skrives*10  #  Træk de tiere fra.
  if skrives > 0
    if skrives == 1  #  Uh-oh...
      # Da vi ikke kan skrive "toogtyve" i stedet for "tolv"
      # må vi lave en speciel undtalgelse for disse
      if    tilbage == 0
        numStreng = numStreng + 'ti'
      elsif tilbage == 1
        numStreng = numStreng + 'elleve'
      elsif tilbage == 2
        numStreng = numStreng + 'tolv'
      elsif tilbage == 3
        numStreng = numStreng + 'tretten'
      elsif tilbage == 4
        numStreng = numStreng + 'fjorten'
      elsif tilbage == 5
        numStreng = numStreng + 'femten'
      elsif tilbage == 6
        numStreng = numStreng + 'seksten'
      elsif tilbage == 7
        numStreng = numStreng + 'sytten'
      elsif tilbage == 8
        numStreng = numStreng + 'atten'
      elsif tilbage == 9
        numStreng = numStreng + 'nitten'
      end
      # da vi allerede har sørget for enerne allerede
      # har vi ikke flere tal tilbage
      tilbage = 0
    elsif skrives == 2
      numStreng = numStreng + 'tyve'
    elsif skrives == 3
      numStreng = numStreng + 'tredive'
    elsif skrives == 4
      numStreng = numStreng + 'fyrre'
    elsif skrives == 5
      numStreng = numStreng + 'halvtreds'
    elsif skrives == 6
      numStreng = numStreng + 'tres'
    elsif skrives == 7
      numStreng = numStreng + 'halvfjerds'
    elsif skrives == 8
      numStreng = numStreng + 'firs'
    elsif skrives == 9
      numStreng = numStreng + 'halvfems'
    end
   
    if tilbage > 0
      numStreng =  'og' + numStreng
    end
  end
 
  skrives = tilbage  #  Hvor mange enere er det tilbage til at skrives ud ?
  tilbage  = 0     #  Træk de enere fra.
 
  if skrives > 0
    if    skrives == 1
      numStreng =  'en' + numStreng
    elsif skrives == 2
      numStreng =  'to' + numStreng
    elsif skrives == 3
      numStreng = 'tre' +  numStreng
    elsif skrives == 4
      numStreng = 'fire' +  numStreng
    elsif skrives == 5
      numStreng = 'fem' +  numStreng
    elsif skrives == 6
      numStreng = 'seks' +  numStreng
    elsif skrives == 7
      numStreng = 'syv' +  numStreng
    elsif skrives == 8
      numStreng = 'otto' +  numStreng
    elsif skrives == 9
      numStreng = 'ni' +  numStreng
    end
  end
 
  if numStreng == ''
  #  den eneste måde 'numStreng' kan være tom på
  #  er hvis voresTal er 0.
    return 'nul'
  end
 
  #  Hvis vi er kommet så langt som hertil, vil vi have et tal et eller andet sted
  #  imellem 0 og hundrede, så vi må returnere 'numStreng'.
  
  return numStreng
end
puts "skriv dit tal her:"
mitTal = gets.chop.to_i
puts danskeTal(mitTal)

Der er et par ting jeg bestemt ikke kan lide ved dette program. For det første har det for mange gentagelser. For det andet kan det ikke tage imod tal der er større end 100. For det tredje er der for mange specielle situationer, for mange returns. Lad os bruge nogle arrays og gøre det lidt pænere.



def danskeTal voresTal
  if voresTal < 0  #  Ingen negative voresTal.
    return 'Skriv venligst et tal der ikke er negativ.'
  end
  if voresTal == 0
    return 'nul'
  end
 
  #  Ikke flere special situationer, ikke flere return
 
  numStreng = ''  #  Dette er strengen som vi vil returnere .
  tiere = '' 
  eneresPlacering = ['et',     'to',       'tre',    'fire',     'fem',
               'seks',     'syv',     'otte',    'ni']
  tieresPlacering = ['ti',     'tyve',    'tredive',   'fyrre',    'halvtreds',
               'tres',   'halvfjerds',   'firs',   'halvfems']
  teenagere = ['elleve',  'tolv',    'tretten', 'fjorten', 'femten',
               'seksten', 'sytten', 'atten', 'nitten']
 
  #  "tilbage" er hvor meget af tallet der stadig mangler at blive skrevet ud
  #  "skrives" er den del af tallet vi skriver ud lige nu.
  #  skrives og  tilbage... forsaaet?  :)
  tilbage  = voresTal
  skrives = tilbage/100          #  Hvor mange hundreder er tilbage til at        #skrives ud ?
  tilbage  = tilbage - skrives*100  #  Træk disse hundreder fra
 
  if skrives > 0
    #  Her er et beskidt trick: 
    hundreder  = danskeTal skrives
    numStreng = numStreng + hundreder + ' hundrede'
    #  Det kaldes 'rekursion'. Så hvad gjorde jeg ? 
    #  Jeg har bedt metoden om at kalde sig selv men med 'skrives' i stedet for
    #  'voresTal'- Husk at 'skrives' er (lige nu) tallet af hundreder
    #  som skal skrives ud. Efter at vi tillægger 'hundreder' til 'numStreng',
    #  vi lægger strengen 'hundrede' efter den. Så for eksempel, hvis
    #  vi fra starten af kaldte 'danskeTal' med 1999 (så 'voresTal' = 1999)
    #  så ville 'skrives' på dette sted være 19 og 'tilbage ville være 99.
    #  Den mest dovne man kan gøre nu, er at få 'danskeTal'
    #  skrive 'nitten' ud for os, så skrives 'hundrede' ud
    #  og så skrives resten af danskeTal ud som 'nioghalvfems'.
   
    if tilbage > 0
    #  Så vi ikke skriver 'to hundredhalvtreds-en'
        #numStreng = numStreng + ' '
         numStreng = numStreng + ' '
    end
  end
 
  skrives = tilbage/10          #  Hvor mange tiere er der tilbage til at skrives ud ?
  tilbage  = tilbage - skrives*10  # Træk dem fra disse tiere
 
  if skrives > 0
    if ((skrives == 1) and (tilbage > 0))
      #  Da vi ikke kan skrive 'tyve-to' i stedet for tolv'
      #  må vi lave en speciel undtagelse for disse.
      numStreng = numStreng + teenagere[tilbage-1]
      #  Vi skriver '-1' fordi teenagere[3] er fjorten og ikke tretten.
      #  Da vi allerede har sørget for enerne her
      #  er der ikke mere der skal skrives.
      tilbage = 0
    else
      ## numStreng = numStreng + tieresPlacering[skrives-1]
      tiere = tieresPlacering[skrives-1]
      #  The "-1" is because tieresPlacering[3] is 'forty', not 'thirty'.
    end
   
    if tilbage > 0
      #  So we don't skrives 'sixtyfour'...
      ## numStreng = numStreng + '-'
      tiere = 'og' + tiere
    end
  end
 
  skrives = tilbage  #  Hvor mange enere er det tilbage til at skrives ud.
  tilbage  = 0     #  Træk dem fra de enere.
 
  if skrives > 0
    ## numStreng = numStreng + eneresPlacering[skrives-1]
    tiere = eneresPlacering[skrives-1]+ tiere
    # puts tiere
    # numStreng =  eneresPlacering[skrives-1] + numStreng
    #  Vi skriver '-1' for at eneresPlacering[3] er 'fire' og ikke 'tre'
  end
   numStreng = numStreng + tiere
  #  Nu returnerer vi numStreng ...
  numStreng
end

puts danskeTal(  0)
puts danskeTal(  9)
puts danskeTal( 10)
puts danskeTal( 11)
puts danskeTal( 17)
puts danskeTal( 32)
puts danskeTal( 88)
puts danskeTal( 99)
puts danskeTal(100)
puts danskeTal(101)
puts danskeTal(234)
puts danskeTal(3211)
puts danskeTal(999999)
puts danskeTal(1000000000000)

nul
ni
ti
elleve
sytten
toogtredive
otteogfirs
nioghalvfems
et hundrede
et hundrede et
to hundrede fireogtredive
toogtredive hundrede elleve
nioghalvfems hundrede nioghalvfems hundrede nioghalvfems
et hundrede hundrede hundrede hundrede hundrede hundrede

Ah... det var meget meget bedre. Programmet er ret kompakt, hvilket var grunden til at jeg skrev så mange kommentarer. Det virker endog med store tal ... selvom det ikke er så godt  som man kunne have håbet. F.eks tror jeg at en milliard eller en million million ville være bedre end det sidste tal (selv om alle tre er korrekte). Faktisk kan du selv rette det  lige nu ...

Nogle ting du kan prøve


Udvid programmet danskeTal, Sæt først tusind ind. Så den returnerer 'et tusind' i stedet for 'ti hundrede' og 'ti tusind' i stedet for 'et hundred hundred'.
Udvid programmet danskeTal. Sæt million ind så du får 'en million' i stedet for 'et tusind tusind'. Prøv så at lægge en milliard ind. Hvor højt kan du komme ?


"Nioghalvfems flasker øl..."   Brug danskeTal og dit gamle program til skrive teksten til denne sang - men på den rigtige måde denne gang. Straf computeren: få den til at starte 9999. (Tag ikke et alt for stort tal, fordi det tager temmeligt lang tid for computeren for computeren at skrive. Hundred tusind flasker øl tager sin tid, og hvis du tager en million straffer du også dig selv.
                                                                                                                                                                                     Tillykke! Nu er du en sand programmør!. Du har lært alt det nødvendige for at bygge store programmer helt fra bunden. Hvis du har ideer til programmer som du gerne vil lave, så bare  gå i gang.
                                                                                                                                                                                     Selvfølgelig er det noget langsomt at bygge alt helt fra bunden. Hvorfor bruge tid på at skrive kode som andre allerede har lavet? Vil du have dit program til at skrive nogle emails ?  Kunne du tænke dig at gemme og indlæse filer fra din computer? Hvad med at få et program til en tutorial hvor kodeeksemplerne faktisk køres hver gang hjemmesiden indlæses ;-) Ruby har mange forskellige slags objekter som vi kan bruge til at skrive bedre programmer hurtigere.


Af Chris Pine

oversat af Gunner Carstens

Original tekst

Indledning

Kapitel 1 - Tal

Kapitel 2 -Bogstaver

Kapitel 3 Variable og tildelinger

Kapitel 4 Blande det hele sammen

Kapitel 5 Mere om metoder

Kapitel 6 Kontrol med strømmen

Kapitel 7 Sæt og Gentagere

Kapitel 8 Skriv dine egne metoder

Kapitel 9 Klasser

Kapitel 10 Blokke og Procs

Kapitel 11 Hvad nu?