[96, 52, 43] == '`4+'
Dette gir jo ingen mening. Eller?
22.6.2022 – Skrevet av Kim Grytøyr
Se for deg at du sitter på kontoret en fredag klokken 15. Dere har nettopp hatt 14-kaffen og begynner å kjenne såvidt på følelsen av helg.
Det eneste du skal gjøre før du går for dagen er å trekke tre heldige kollegaer av deg som får gleden av å bringe med seg en flaske druevann hjem til helgen. Det er 100 lodd, og du har ved hjelp av denne lille kodesnutten, som du kjører i iEX, kommet frem til tre vinnerlodd:
for _ <- 0..2, do: :rand.uniform(100)
Dette vil vise en liste med tre tall som alle er >= 1 og <= 100, tenker du. Du trykker håpefullt på enter-tasten mens du funderer på hva du skal gjøre denne fredagskvelden. Gå på kino, kanskje? Dra på fisketur? Fredagstaco foran TV-en?
Før du rekker å konkludere kommer plutselig dette opp på skjermen din:
iex(1)> for _ <- 0..2, do: :rand.uniform(100)
'F<<'
'F<<'
? Det var jo ikke dette du hadde bedt om. Du tenker at det må ha skjedd noe feil, så du gir det et nytt forsøk:
iex(2)> for _ <- 0..2, do: :rand.uniform(100)
' \eC'
' \eC'... Du begynner å lure på om :rand.uniform/1 kanskje ikke fungerer helt slik som du tror, så du sjekker dokumentasjonen, men den bekrefter bare at du har gjort alt riktig.
Så, hva er det som skjer?
Kort forklart er det slik i Elixir og Erlang at det ikke er noen praktisk forskjell på en streng med enkeltfnutter og en liste med tall. Altså er strengen ' \eC'
nøyaktig det samme som [32, 27, 67]
.
Når iEX viser resultatet av et uttrykk brukes inspect/2
bak kulissene, og den er som standard konfigurert til å vise slike lister som charlists. Det blir da en streng med enkeltfnutter, forutsatt at alle tallene i listen er "skrivbare", altså tallene 32-126.
Dette kan vi bekrefte ved å gjøre den motsatte øvelsen:
iex(3)> ' \eC'
[32, 27, 67]
Som vi ser blir dette vist som en liste med tall.
Om du ønsker å endre hvordan iEX håndterer dette kan du gjøre det i den nåværende sesjonen ved å skrive følgende:
IEx.configure(inspect: [charlists: :as_lists])
Og hvis du ønsker å gjøre denne endringen permanent for prosjektet ditt kan du også putte den samme linjen i en fil med navn .iex.exs
i rotmappen av prosjektet ditt.
Når du så har gjort det kan du endelig kåre en vinner i ukens lotteri:
iex(4)> for _ <- 0..2, do: :rand.uniform(100)
[24, 4, 60]