Do you want to pick up from where you left of?
Take me there

Sigiler

Bruke og lage sigiler.

Sigil Oversikt

Elixir har en alternativ syntaks for å representere og jobbe med literaler. En sigil starter med en tilde ~ etterfulgt av en bokstav. Elixir inkluderer et par standard sigiler, men det er også mulig å opprette sine egne sigiler.

En liste av tilgjengelige sigiler:

Skilletegn i Elixir:

Enkel karakterliste

Sigilet ~c og ~C lager en enkel karakterliste, eksempel:

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

Vi kan se at ~c tekst interpolerer regnestykket, mens ~C ikke gjør det. Slike forskjeller mellom små og store bokstaver er ganske vanlig med de innebygde sigilene.

Regulære Uttrykk

Sigilene ~r og ~R er brukt til å representere regulære uttrykk. Vi kan enten lage de på sparket, eller benytte de i funksjonene som tar i bruk Regex. For eksempel:

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

I den første testen tester vi for ekvalitet, og vi ser at Elixir ikke er ekvivalent med det regulære uttrykket. Dette er fordi E-en i Elixir har stor forbokstav, mens det regulære uttrykket kun sjekker for små bokstaver. Elixir støtter regulære uttrykk som er kompatible med Perl. Vi kan legge til en i i enden av sigilet for å unngå at den skiler mellom stor og liten bokstav:

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

Elixir har en innebygd Regex modul Regex som bygger videre på Erlang sitt regulære uttrykk bibliotek. La oss implementere Regex.split/2 ved å bruke en regex sigil

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

Strengen "100_000_000" er splittet på understreken takket være ~r/_/ sigilet, og Regex.split returnerer en liste.

Streng

~s og ~S sigilene er brukt for å lage en større mengde med tekst, for eksempel:

iex> ~s/Katten i hatten på matta/
"Katten i hatten på matta"

iex> ~S/Katten i hatten på matta/
"Katten i hatten på matta"

Forskjellen er likt med karakter liste sigilet som vi så på tidligere. Det som er forskjellig er bruken av avsnitt og slike sekvenser. For eksempel:

iex> ~s/Velkommen til elixir #{String.downcase "SKOLEN"}/
"velkommen til elixir skolen"

iex> ~S/velkommen til elixir #{String.downcase "SKOLEN"}/
"velkommen til elixir \#{String.downcase \"SKOLEN\"}"

Ordlister

Ordlistesigilet kan spare både tid og antall tastetrykk. For eksempel:

iex> ~w/jeg elsker elixir skolen/
["jeg", "elsker", "elixir", "skolen"]

iex> ~W/jeg elsker elixir skolen/
["jeg", "elsker", "elixir", "skolen"]

Vi kan se at det som er skilt med skilletegn er separert med mellomrom til en liste. Men, det er ingen forskjell mellom disse to eksemplene. Forskjellen kommer med tekstinterpolering og avsnittssekvenser. Ta det følgende eksempelet:

iex> ~w/jeg elsker #{'e'}lixir skolen/
["i", "love", "elixir", "school"]

iex> ~W/jeg elsker #{'e'}lixir skolen/
["jeg", "elsker", "\#{'e'}lixir", "skolen"]

Å Lage Sigiler

Et av målene til Elixir er å være et utvidtbart programmeringsspråk. I dette eksempelet, så vil vi lage et sigil for å konverterer en tekststreng i små bokstaver til store bokstaver. Etter som det allerede er en funksjon for dette i standard biblioteket (String.upcase/1), så vil vi lage en sigil som tar i bruk denne funksjonen.


iex> defmodule MineSigiler do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MineSigiler
nil

iex> ~u/elixir skolen/
ELIXIR SKOLEN

Først definerer vi en modul med navnet MineSigiler. Vi lager så en funksjon med navnet sigil_u. Siden Elixir ikke har en standard ~u sigil, kan vi bruke dette tegnet. _u endelsen i funksjonen indikerer at vi ønsker å benytte bokstaven u etter tilde ~ tegnet for å benytte sigilen. Når man lager en egen funksjon som skal fungere som en sigil, kreves det to argumenter - et input, og en liste.

Har du oppdaget en feil eller ønsker å bidra til leksjonen? Rediger denne leksjonen på GitHub!