2009-08-14 11 views
20

Dlaczego kompilowanie ten kod:Dlaczego zmienna Erlang jest nieużywana?

triples([], _,_,_)-> 
    []; 

triples(Self, X, Y, none)-> 
    [ Result || Result = { X, Y, _} <- Self ]. 

raport:

./simple_graph.erl:63: Warning: variable 'X' is unused 
./simple_graph.erl:63: Warning: variable 'Y' is unused 
./simple_graph.erl:64: Warning: variable 'X' is unused 
./simple_graph.erl:64: Warning: variable 'X' shadowed in generate 
./simple_graph.erl:64: Warning: variable 'Y' is unused 
./simple_graph.erl:64: Warning: variable 'Y' shadowed in generate 

i powrócić niewłaściwy wynik: pełny Jaźni.

Odpowiedz

51

Dzieje się tak dlatego, że zmienne występujące w LHS generatorów, X i Y tutaj, są zawsze nowymi niezwiązanymi zmiennymi lokalnymi dla zrozumienia. Oznacza to, że nie są to te same zmienne co X i Y w głowie potrójnej, a zatem nie ma żadnego niejawnego testu równości. Jest to podobne do zabawy, w której wszystkie zmienne występujące w głowie zabawy to nowe zmienne lokalne dla zabawy.

To różni się od większości pozostałych erlang, dlatego kompilator nie tylko ostrzega, że ​​X i Y w głowie nie są używane, ale także, że X i Y w zrozumieniu cienia pozostałe zmienne. Są również nieużywane w ogóle w rozumieniu.

Łatwym sposobem, aby dostać to, co chcesz:

[ Result || Result = {X1,Y1,_} <- Self, X =:= X1, Y =:= Y1 ] 
+5

Wow. To jest gotcha! – Christian

+0

Świetne wyjaśnienie, jak działają linie w Erlang. I świetny List-Zrozumienie - Ninja – Aus

Powiązane problemy