2012-12-04 14 views
14

Jakie są dokładne różnice między podkreślnikami i zmienną o określonej nazwie, która zaczyna się od podkreślenia z punktu widzenia kompilatora Erlang (oprócz dodania czytelności do kodu)? Na przykład: _ i _Var są różne?Zmienne anonimowe w Erlang

Odpowiedz

20

The nie obchodzi zmienna _ jest VERY SPECIAL zmienna, która pasuje niczego i jest NIGDY związany z wartością. Używa się go, gdy wiem, że coś tam jest, ale nie obchodzi mnie, jaka jest wartość i nigdy go nie użyję. Widzenie _ nigdy nie jest ograniczone, nie można go używać w wyrażeniu, a kompilator sygnalizuje je jako błąd.

Zmienne typu _Var są całkowicie normalnymi zmiennymi, które można dopasować i które będą wiązały się z wartościami, co oznacza, że ​​mogą być używane w wyrażeniach.Przedrostek zmiennej z _ jest około zamiar. Kompilator zwykle ostrzega o zmiennej, która jest związana we wzorce, ale nigdy nie jest używana, co często jest oznaką błędu. Ale kompilator nie ostrzega o zmienne poprzedzone prefiksem _, podobnie jak w _Var. Chodzi o to, że chcę nadać zmiennej nazwę, nazywając rzeczy dobrze, ale wiem, że nigdy jej nie użyję.

Pamiętaj, że _ jest naprawdę jedyną specjalną zmienną, a _Var są normalnymi zmiennymi i zachowują się tak jak w przypadku użycia. Jeśli czujesz się perwersyjny, możesz przedłużyć wszystkie zmienne za pomocą _ i wszystko będzie działać.

+0

Dzięki! To była pełna odpowiedź :-) – coffeMug

18

Zacytujmy doc tutaj:

Zmienna anonimowy oznaczamy podkreślenia (_) i może być stosowany gdy wymagany jest zmienny, ale jego wartość może być ignorowane. [...]

Zmienne zaczynające się od podkreślenia (_), na przykład _Height są normalne zmienne, a nie anonimowy: są one jednak ignorowane przez kompilator w tym sensie, że nie będzie generować żadnych ostrzeżeń dla nieużywanych zmiennych .

Innymi słowy, należy użyć _Var formę kiedy trzeba dopasowanego wyrażenia być dopasowane - ale nie chcą używać go dalej i/lub chcesz pokazać swoje znaczenie. Używasz zmiennej _, gdy ani ty, ani kompilator nie powinniście się przejmować wyrażeniem, które zostanie z nim dopasowane.

Przykład 1:

member(_, []) -> []. 

W tej funkcji nie jest do końca jasne, co pierwsze _ mecze. Ale przepisanie go bezpośrednio, jak to:

member(Elem, []) -> []. 

... wygeneruje ostrzeżenie, jeśli kod jest skompilowany z flagą warn_unused_vars zestawie. Nadal może sprawić, że kod czytelny tutaj, choć za pomocą podkreślił zmiennej:

member(_Elem, []) -> []. 

Przykład 2:

{_, _, Some} = {1, 2, 3} 

To dopasowanie krotka pójdzie chociaż dość dobrze, jak w pierwszych dwóch elementów krotki zostanie całkowicie zignorowana.

{_Var, _Var, Some} = {1, 2, 3} 

To dopasowanie nie powiedzie się, jednakże: chociaż _Var nie będą musiały być wykorzystane, powinno być „wypełnione” z tej samej wartości! Ponieważ 1 nie jest równe 2, warunek tutaj kończy się niepowodzeniem.

+0

OK, ale czy jest jakiś powód, aby nie używać takich zmiennych, których nazwa zaczyna się od podkreślenia? – coffeMug

+0

@AKh_Sw Ponieważ głównie chcesz ostrzeżenia kompilatora dla nieużywanych zmiennych, to właśnie dlatego istnieje. –

+1

@AKh_Sw Jak wyjaśniono na końcu odpowiedzi (przykład 2), może utworzyć badmatch. Wyobraź sobie, że masz złożony kod, a po refaktoryzacji decydujesz się na niewykorzystanie wcześniej użytej zmiennej, ale ta zmienna wystąpiła kilka razy w tym złożonym kodzie. Po prostu nie używasz tego, ale w rzeczywistości jest on używany. Wtedy możesz mieć nieoczekiwaną próbkę. Ponadto, potrzeba użycia tych zmiennych podkreślenia w celu udokumentowania kodu jest czasami uważana za "zapach kodu" i zaproszenie do jego uproszczenia. –