Provoni

5 gjërat që mund të mos i keni provuar në Elixir | E avancuar

Më mirë të provosh dhe të dështosh sesa të jesh kot.

Ndërsa mësova të programoja në Elixir, zbulova disa gjëra të çuditshme. Në këtë postim, unë zhytem në 5 qasjet e çuditshme që ju mund ose nuk mund të dini për të ekspozuar mekanizmat e saj themelorë.

Biseda është e lirë, këtu është kodi.

1. Përpiloni përputhjen e modelit të strukturës së kohës dhe kohës së ekzekutimit - në mënyra të ndryshme

Ne të gjithë e dimë se strukturat mund të përputhen me modelin %StructName{}

Merrni parasysh strukturën e mëposhtme Student

defmodule Student do
  defstruct name: "john"
end

Ne përgjithësisht përdorim qasjen e mëposhtme për të përputhur modelin me strukturën e mësipërme. Por, ai pret që struktura të jetë e disponueshme në vetë kohën e përpilimit.

%Student{} = student

Struktura gjithashtu mund të përputhet me modelin si

%{__struct__: Student} = student

Por nuk do të japë asnjë gabim nëse struktura nuk është e disponueshme në kohën e përpilimit.

Le të kontrollojmë të dyja qasjet.

[1]. Qasja: %ModuleName{ }

Këtu, ne strukturën e përputhjes së modelit si %Student{} dhe moduli duhet të jetë i disponueshëm deri në momentin që përcakton funksionin anonim print.

Le të kontrollojmë se çfarë nëse ngarkojmë së pari funksionin print këtu

# Load first
print = 
  fn %Student{} = student -> 
    IO.inspect student.name 
  end
# Load Next
defmodule Student do
  defstruct name: "john"
end

Ju jep një student ** (Gabim Kompilues).__struct__/0 është i papërcaktuar

[2]. Qasja %{__struct__: StructName}

Këtu, ne strukturën e përputhjes së modelit si %{__struct__: Student} si çdo hartë e rregullt që pret një çelës si __struct__ dhe vlerën e tij si Student.
Siç e dimë të gjithë se struktura do të ketë një çelës shtesë __struct__ me vlerë si emri i modulit në të cilin ishte përcaktuar, këtu Student.

Këtu, ne thjesht përputhemi me tastin __struct__ të modelit.

# Load first
print = 
  fn %{__struct__: Student} = student -> 
    IO.inspect student.name 
  end
# Load Next
defmodule Student do
  defstruct name: "john"
end

Kontrolloni ndryshimin midis këtyre dy qasjeve në pamjen e mëposhtme të ekranit gjatë ekzekutimit në iex

Qasja 1 do të sigurohet për disponueshmërinë e strukturës në kohën e përpilimit, ndryshe nga qasja 2.

Shpresoj se keni marrë idenë se kur të përdorni dhe cilën qasje të përdorni. Por, në nivelin e prodhimit, ne shohim më së shumti stilin përqasje 1 %Student{}. Ne duhet të sigurojmë ekzistencën e strukturës.

2. Re Bounding mund të dështojë në Elixir në disa raste

Ne të gjithë e dimë se në eliksir kemi lirinë e rikthimit të një ndryshoreje. Kjo do të thotë, konsideroni x = 5 dhe pas disa deklaratave, ne mund ta kthejmë ndryshoren x në një vlerë tjetër si x = 10

A keni provuar ndonjëherë të tërhiqeni në të njëjtin udhëzim?

Provoni këtë

iex> [a, b, a] = [1, 2, 3]

Cila është vlera e a këtu?

Deri në ekzekutim, ai ju jep gabimin e përputhjes ** (MatchError) nuk përputhet me vlerën e krahut të djathtë: [1, 2, 3]

Le ta provojmë këtë përsëri me

iex> [a, b, a] = [1, 2, 1]

Tani, a është e barabartë me 1

Ju mund ta përdorni këtë logjikë kur prisni që diçka të përputhet saktësisht më parë.

3. Konvertimi i listave IO në Binary

Në Elixir, ne përdorim funksionet e modulit IO për trajtimin e hyrjes/daljes. Ndërtimi i të dhënave IO është shumë më i lirë se lidhja e vargjeve. Kur bëjmë lidhjen përmes interpolimit të vargut #{}kjo do të thotë se ne po dublikojmë të dhënat këtu. Shpjegimi i këtyre termave është përtej qëllimit të këtij neni.

Merrni parasysh linjat e mëposhtme të kodit

:erlang.iolist_to_binary [1, 2, 3, 4, 5, 255]

Kjo funksionon mirë.

Tani, le të provojmë me number > 255

:erlang.iolist_to_binary [1, 2, 3, 4, 5, 256]

Kjo ju jep një gabim argumenti duke thënë ** (ArgumentError) gabim argumenti
:erlang.iolist_to_binary([1, 2, 3, 4, 5, 256])

Numrat e plotë në të dhënat IO konsiderohen si bajt ndërsa numrat e plotë në chardata janë pika Unicode.

Bajt janë numra të plotë në intervalin 0..255
Unicode janë numra të plotë në intervalin 0..0x10FFFF d.m.th. 0..17825776

4. Konvertimi i listave të papërshtatshme në binare

Shpresoj se keni ditur tashmë për strukturën e gabuar të listës në Elixir. Nëse jo, di më shumë rreth "listave të pahijshme".

Tani, le t'i konvertojmë listat e pahijshme në binare. Përpara se të shkojmë më tej, duhet të kuptojmë se si e përkufizojmë iolist.

Kontrolloni pamjen e mëposhtme të ekranit.

Pra, lista IO mund të jetë lista_boshe []oseBinaryose[iohead|iotaill]dhe

:erlang.iolist_to_binary ["foo" | "1"]

Kjo funksionon siç pritej pasi iohead dhe iotail për listën e dhënë janë të llojit Binary.

[iohead|iotail]
=
["foo" | "1"]

këtu, iotail është "1" është Binar

Nga përkufizimi, i vetmi iohead mund të ketë numra dhe bishtat lejohen vetëm [], binare dhe Lista IO të tjera >.

Tani, le të bëjmë iotail në numër nga diapazoni 0..255

:erlang.iolist_to_binary ["foo" | 1]

Kjo ende ju jep një gabim argumenti pasi iotail nuk është as [] as Binary as iolist

5. Përcaktimi i modulit Erlang në modulin Elixir

Siç e dimë të gjithë se Emrat e Modulit të Elixirit janë vetëm atome. Për shembull, emri i modulit Studenti është i barabartë me një atom të stilit :"Elixir.Student"

iex> Student == :"Elixir.Student"
true

Ne mund të bëjmë alias modulin erlang në një stil të emrit të modulit Elixir.

alias :math, as: Math
alias :math, as: :"Elixir.MathLib"

Megjithatë, ju nuk mund të emërtoni modulin Erlang me një stil tjetër të emrit të modulit Erlang.

alias :math, as: :math2
#This gives you the compile time error

Gëzuar kodimin !!

Bashkohuni në kanalin tonë Telegram Blackoders



Shikoni depon e GitHub në Këshillat e eliksirit vrasës

Gëzohem nëse mund të kontribuoni me një ★