Ruby:Literals
Fra CodeWiki
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
