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
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ć.
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.
OK, ale czy jest jakiś powód, aby nie używać takich zmiennych, których nazwa zaczyna się od podkreślenia? – coffeMug
@AKh_Sw Ponieważ głównie chcesz ostrzeżenia kompilatora dla nieużywanych zmiennych, to właśnie dlatego istnieje. –
@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. –
- 1. Współdzielone zmienne w kontekście podprogramów a anonimowe podprogramy
- 2. Dlaczego zmienne w Erlang mają na początek wielką literę?
- 3. Zmienne przypisanie w eliksiru
- 4. Anonimowe klasy w PHP 7
- 5. Jak anonimowe klasy w TypeScript
- 6. Funkcje anonimowe w skryptach powłoki
- 7. Niedopasowane anonimowe moduł define()
- 8. Powróć anonimowe funkcje
- 9. Anonimowe plasterki Hash - składnia?
- 10. Javascript Zamknięcie anonimowe
- 11. Java: anonimowe wyliczenia?
- 12. Typy WCF i anonimowe
- 13. Jak rozłączyć anonimowe wydarzenie?
- 14. Samouściowe moduły anonimowe JavaScript
- 15. Zmienne Zmienne w JS
- 16. Błąd wyjątku w Erlang
- 17. Dopasowany binarne w Erlang
- 18. funkcja mapowa w Erlang
- 19. S kombinator w Erlang
- 20. Stan w Erlang Digraphs
- 21. > symbole w Erlang
- 22. Powrót w Erlang
- 23. Wyznaczanie ciągów w Erlang
- 24. Selektywne odbieranie w Erlang
- 25. Jak uruchomić aplikację Erlang wewnątrz powłoki Erlang
- 26. Dlaczego używane są anonimowe funkcje używane w strukturze kodu JavaScript?
- 27. Przekształcanie przykładu portu Erlang-C w Erlang-Golang
- 28. Erlang pytania
- 29. Jak symulować anonimowe klasy w C#
- 30. Anonimowe zajęcia z lambdami w Kotlin
Dzięki! To była pełna odpowiedź :-) – coffeMug