Erlang Language
Typy danych
Szukaj…
Uwagi
Każdy typ danych w erlang nazywa się Term. Jest to ogólna nazwa, która oznacza dowolny typ danych .
Liczby
W Erlang liczby są liczbami całkowitymi lub liczbami zmiennoprzecinkowymi. Erlang używa arbitralnej precyzji dla liczb całkowitych (bignów), więc ich wartości są ograniczone tylko wielkością pamięci twojego systemu.
1> 11.
11
2> -44.
-44
3> 0.1.
0.1
4> 5.1e-3.
0.0051
5> 5.2e2.
520.0
Liczby mogą być używane w różnych bazach:
1> 2#101.
5
2> 16#ffff.
65535
Notacja z prefiksem $
zwraca wartość całkowitą dowolnego znaku ASCII / Unicode:
3> $a.
97
4> $A.
65
5> $2.
50
6> $🤖.
129302
Atomy
Atom jest obiektem o nazwie, która jest identyfikowana tylko przez samą nazwę.
Atomy są zdefiniowane w Erlangu za pomocą literałów atomowych, które są albo
- niecytowany ciąg, który zaczyna się od małej litery i zawiera tylko litery, cyfry, znaki podkreślenia lub znak
@
, lub - Ciąg pojedynczego cudzysłowu
Przykłady
1> hello.
hello
2> hello_world.
hello_world
3> world_Hello@.
world_Hello@
4> '1234'.
'1234'
5> '!@#$%% ä'.
'!@#$%% ä'
Atomy stosowane w większości programów Erlang
Niektóre atomy pojawiają się w prawie każdym programie Erlang, w szczególności ze względu na ich użycie w bibliotece standardowej.
-
true
ifalse
są używane do oznaczenia odpowiednich wartości logicznych -
ok
jest zwykle używane jako wartość zwracana przez funkcję wywoływaną tylko dla jej efektu lub jako część wartości zwracanej, w obu przypadkach w celu oznaczenia pomyślnego wykonania - W ten sam sposób
error
jest używany do oznaczenia warunku błędu, który nie gwarantuje wczesnego powrotu z górnych funkcji -
undefined
jest zwykle używana jako symbol zastępczy dla nieokreślonej wartości
Użyj jako tagi
ok
i error
są dość często używane jako część krotki, w której pierwszy element krotki sygnalizuje sukces, podczas gdy kolejne elementy zawierają rzeczywistą wartość zwracaną lub warunek błędu:
func(Input) ->
case Input of
magic_value ->
{ok, got_it};
_ ->
{error, wrong_one}
end.
{ok, _} = func(SomeValue).
Przechowywanie
Podczas korzystania z atomów należy pamiętać, że są one przechowywane w swojej własnej tabeli globalnej w pamięci, a ta tabela nie jest gromadzona w pamięci, więc dynamiczne tworzenie atomów jest szczególnie odradzane, gdy użytkownik może wpływać na nazwę atomu.
Pliki binarne i ciągi bitów
Binarny jest sekwencją 8-bitowych bajtów bez znaku.
1> <<1,2,3,255>>.
<<1,2,3,255>>
2> <<256,257,258>>.
<<0,1,2>>
3> <<"hello","world">>.
<<"helloworld">>
Łańcuch bitów to uogólniony plik binarny, którego długość w bitach niekoniecznie jest wielokrotnością liczby 8.
1> <<1:1, 0:2, 1:1>>.
<<9:4>> % 4 bits bitstring
Krotki
Krotka to uporządkowana sekwencja innych terminów Erlang o stałej długości. Każdy element w krotce może być dowolnym rodzajem terminu (dowolnym typem danych).
1> {1, 2, 3}.
{1,2,3}
2> {one, two, three}.
{one,two,three}
3> {mix, atom, 123, {<<1,2>>, [list]}}.
{mix,atom,123,{<<1,2>>,[list]}}
Listy
Lista w Erlang jest sekwencją zero lub więcej terminów Erlang, zaimplementowaną jako pojedynczo połączona lista. Każdy element na liście może być dowolnym rodzajem terminu (dowolnym typem danych).
1> [1,2,3].
[1,2,3]
2> [wow,1,{a,b}].
[wow,1,{a,b}]
Głowa listy jest pierwszym elementem listy.
Ogon listy jest resztą listy (bez głowy). To także lista.
Możesz użyć hd/1
i tl/1
lub dopasować do [H|T]
aby uzyskać nagłówek i koniec listy.
3> hd([1,2,3]).
1
4> tl([1,2,3]).
[2,3]
5> [H|T] = [1,2,3].
[1,2,3]
6> H.
1
7> T.
[2,3]
Przygotowanie elementu do listy
8> [new | [1,2,3]].
[new,1,2,3]
Listy konkatenacyjne
9> [concat,this] ++ [to,this].
[concat,this,to,this]
Smyczki
W Erlang ciągi nie są oddzielnym typem danych: są to tylko liczby całkowite reprezentujące punkty kodowe ASCII lub Unicode:
> [97,98,99].
"abc"
> [97,98,99] =:= "abc".
true
> hd("ABC").
65
Kiedy powłoka Erlang wydrukuje listę, próbuje zgadnąć, czy rzeczywiście miał to być ciąg znaków. Możesz wyłączyć to zachowanie, wywołując shell:strings(false)
:
> [8].
"\b"
> shell:strings(false).
true
> [8].
[8]
W powyższym przykładzie liczba całkowita 8 jest interpretowana jako znak kontrolny ASCII dla backspace, który powłoka uważa za „prawidłowy” znak w ciągu.
Identyfikatory procesów (Pid)
Każdy proces w erlang ma identyfikator procesu ( Pid
) w tym formacie <xxx>
, gdzie x
jest liczbą naturalną. Poniżej znajduje się przykład Pid
<0.1252.0>
Pid
może być używany do wysyłania wiadomości do procesu za pomocą „bang” ( !
), Również Pid
może być powiązany ze zmienną, obie są pokazane poniżej
MyProcessId = self().
MyProcessId ! {"Say Hello"}.
Przeczytaj więcej o tworzeniu procesów i ogólnie o procesach w erlang
Funs
Erlang to funkcjonalny język programowania. Jedną z funkcji języka programowania funkcji jest obsługa funkcji jako danych (obiektów funkcjonalnych).
- Przekaż funkcję jako argument do innej funkcji.
- Zwraca funkcję jako wynik funkcji.
- Funkcje wstrzymania w strukturze danych.
W Erlang funkcje te nazywane są zabawami. Zabawy są funkcjami anonimowymi.
1> Fun = fun(X) -> X*X end.
#Fun<erl_eval.6.52032458>
2> Fun(5).
25
Fani mogą mieć także kilka klauzul.
3> AddOrMult = fun(add,X) -> X+X;
3> (mul,X) -> X*X
3> end.
#Fun<erl_eval.12.52032458>
4> AddOrMult(mul,5).
25
5> AddOrMult(add,5).
10
Możesz także używać funkcji modułu jako funs ze składnią: fun Module:Function/Arity
.
Na przykład, weźmy funkcję max
z modułu lists
, który ma arity 1.
6> Max = fun lists:max/1.
#Fun<lists.max.1>
7> Max([1,3,5,9,2]).
9
Mapy
Mapa to tablica lub słownik asocjacyjny złożony z par (klucz, wartość).
1> M0 = #{}.
#{}
2> M1 = #{ "name" => "john", "age" => "28" }.
#{"age" => "28","name" => "john"}
3> M2 = #{ a => {M0, M1} }.
#{a => {#{},#{"age" => "28","name" => "john"}}}
Aby zaktualizować mapę:
1> M = #{ 1 => x }.
2> M#{ 1 => c }.
#{1 => c}
3> M.
#{1 => x}
Zaktualizuj tylko niektóre istniejące klucze:
1> M = #{ 1 => a, 2 => b}.
2> M#{ 1 := c, 2:= d }.
#{1 => c,2 => d}
3> M#{ 3 := c }.
** exception error: {badkey,3}
Dopasowywanie wzorów:
1> M = #{ name => "john", age => 28 }.
2> #{ name := Name, age := Age } = M.
3> Name.
"john"
4> Age.
28
Składnia bitów: Domyślnie
Wyjaśnienie dokumentu Erlanga na temat składni bitowej:
4.4 Domyślne
[Początek pominięty: << 3.14 >> nie jest nawet legalną składnią.]
Rozmiar domyślny zależy od typu. Dla liczb całkowitych jest to 8. Dla liczb zmiennoprzecinkowych jest to 64. W przypadku plików binarnych jest to rzeczywisty rozmiar określonego pliku binarnego:
1> Bin = << 17/integer, 3.2/float, <<97, 98, 99>>/binary >>. <<17,64,9,153,153,153,153,153,154,97,98,99>> ^ |<-------------------------->|<------>| | float=64 binary=24 integer=8 2> size(Bin). % Returns the number of bytes: 12 % 8 bits + 64 bits + 3*8 bits = 96 bits => 96/8 = 12 bytes
W dopasowaniu segment binarny bez rozmiaru jest dozwolony tylko na końcu wzorca, a domyślny rozmiar to reszta pliku binarnego po prawej stronie dopasowania:
25> Bin = <<97, 98, 99>>. <<"abc">> 26> << X/integer, Rest/binary >> = Bin. <<"abc">> 27> X. 97 28> Rest. <<"bc">>
Wszystkie pozostałe segmenty z typem binarnym we wzorcu muszą określać rozmiar:
12> Bin = <<97, 98, 99, 100>>. <<"abcd">> 13> << B:1/binary, X/integer, Rest/binary >> = Bin. %'unit' defaults to 8 for <<"abcd">> %binary type, total segment size is Size * unit 14> B. <<"a">> 15> X. 98 16> Rest. <<"cd">> 17> << B2/binary, X2/integer, Rest2/binary >> = Bin. * 1: a binary field without size is only allowed at the end of a binary pattern