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 []
oseBinary
ose[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ë ★