Ruby:Literals

Fra CodeWiki

Gå til: navigasjon, søk

Innhold

Literals for tall

Følgende måter er mulig å bruke for å instantiere objekter som holder tall.

tall = 42  # heltall. Typen til "tall" er nå Fixnum.
tall = 0x2a  # hexadesimal notasjon. Typen til "tall" er fortsatt Fixnum.
tall = 0o52  # oktal notasjon (med bokstaven 'o'). Fortsatt Fixnum.
tall = 0b101010  # binær notasjon. Fortsatt Fixnum.
tall = 1_000_000_000_000  # Ruby hopper over underscore i parsingen, dette blir 1 billion. Typen er nå Bignum.
 
tall = 1.0  # flyttall. Typen til "tall" er nå Float.
tall = 1.0e+10  # vitenskaplig notasjon. Fortsatt Float.

Alle disse notasjonene kan prefikses med et minus for å få en negativ verdi.

Literals for tekst

Her er det to hovedmåter å gjøre det på. Den ene gir deg muligheten til å få satt inn verdien av variabler, mens den andre ikke gjør dette.

tekst = 'Hei, verden'  # Ingenting magisk her. "tekst" har typen String.
tekst = "Hei, verden"  # Fortsatt ingenting magisk.
svaret = 42
tekst = '#{svaret} er et tall'  # Her skjer det heller ikke noe magisk. Teksten blir "#{svaret} er et tall".
tekst = "#{svaret} er svaret på det ultimate spørsmålet"  # Her settes verdien av variabelen "svaret" inn mellom klammene.
 
tekst = %q(dette er en tekst)  # => "dette er en tekst"
tekst = %q(dette er (en) tekst)  # => "dette er (en) tekst"
tekst = %q!dette er en tekst!  # => "dette er en tekst"
 
tekst = %q(#{svaret} er et tall)  # => "#{svaret} er et tall"
tekst = %Q(#{svaret} er et tall)  # => "42 er et tall"
tekst = %(#{svaret} er et tall)  # => "42 er et tall"

Som vi ser, så skjer ikke "streng-interpolering" når vi bruker enkle siteringstegn, eller %q-varianten. Vi ser også at ved å bruke %q() kan vi velge hvilke tegn vi vil bruke som separatorer. Dersom vi velger klamme-tegn er Ruby smart nok til å finne den motstående klammen, og nøsting (flere nivåer) av klammer gjør ingen ting.

Vi har også muligheten til å skrive HERE-docs, slik som i f.eks. Perl:

tekst = <<EOT
Dette er tekst
 over flere linjer.
EOT  # => "Dette er tekst\n over flere linjer."
 
tekst = <<-EOT
Dette er tekst
  over flere linjer.
  EOT  # => "Dette er tekst\n  over flere linjer."

Dersom man bruker bindestreken kan man la sluttmarkøren stå hvor som helst på linjen, mens uten er den nødt til å stå på første kolonne (starten av linjen).

Ved å bruke en string literal til å initialisere en variabel som skal inneholde tekst vil det bli laget et nytt String-objekt. Du vil med andre ord ikke få to referanser til det samme objektet ved å lage to variabler som initialiseres med samme literal.

Literals for Arrays

Ved å kombinere literals for tall og tekst kan vi opprette en Array ved å bruke firkant-klammer og komma:

tall = [1, 2, 3, 4]  # => [1, 2, 3, 4]
tekst = ["en", "to", "tre", "fire"]  # => ["en", "to", "tre", "fire"]
tall_og_tekst = tall.zip(tekst)  # => [[1, "en"], [2, "to"], [3, "tre"], [4, "fire]]
arr = [1, 2, 3, ]  # => [1, 2, 3]

Merk at et komma for mye ikke gjør noe. Vi kan også bruke andre triks. Siden det er vanlig å opprette en array med ord, finnes det en snarvei for å gjøre dette også:

ord = %w(en to tre fire)  # => ["en", "to", "tre", "fire"]

Literal for Hash

Siden Hash-klassen også er veldig mye brukt i Ruby (som med andre scripting-språk), finnes det en literal for denne også:

navn_og_nummer = {"Ole" => 1, "Per" => 2}
annen_hash = {:foo => [1, 2, 3]}

I Ruby 1.9, som er under aktiv utvikling er det mulig å bruke en alternativ syntax som trolig blir med til Ruby 2.0:

min_hash = {:foo: => [1, 2, 3]}  # => {:foo => [1, 2, 3]}

Literal for Range

Rekker har også en literal (to faktisk):

en_til_ti = (1..10)  # => (1..10)
en_til_ni = (1...10)  # => (1...10)

Den første gir en rekke med tallene 1-10 inklusiv: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, mens den andre gir 1-10 eksklusiv: {1, 2, 3, 4, 5, 6, 7, 8, 9}.

Literal for Symbol

For å opprette et nytt symbol bruker man kolon + navn:

sym = :symbol  # oppretter symbolet :symbol

Literals for Regexp

Ruby har utmerket støtte for regulære uttrykk, og bruken av dem er så godt som gjennomsiktig:

tall = /\d+/  # Lager et regulært uttrykk som matcher ett eller flere tall.
har_g = /g/i  # Lager et regulært uttrykk som ikke er case sensitivt.
har_g = %r(g)i  # Samme som over.
 
"tekst".match /\w+/  # Spør det nyopprettede String-objektet om den matcher det nyopprettede Regexp-objektet.

Opprette anonyme funksjoner

Vi kan opprette "anonyme funksjoner" ved å bruke nøkkelordet lambda og gi det en kodeblokk. lambda oppretter et Proc-objekt og passer på at det reiser en Exception dersom man prøver å kalle procen med feil antall argumenter.

adderer = lambda {|n1,n2| n1 + n2}
adderer.call(2, 2)  # => 4
adderer[2, 2]  # => 4
 
legg_til_to = lambda {|n| adderer.call(2, n)}
legg_til_to.call(2)  # => 4
legg_til_to[2]  # => 4
Personlige verktøy
dataprogrammering
generelt