2016-07-29 3 views
2

Ist es möglich, eine Guard-Sequenz zu setzen, die sowohl den Term-Typ als auch seine Länge überprüft? Ich habe gelesen, dass der erste vorübergehende Wächter die ganze Sequenz passiert, also nehme ich an, wenn ich nach dem Begriff suche, um eine Liste zu sein, überprüft er nicht die Restwachen. Hier ist der Code:Eine Erlang-Guard-Sequenz, die überprüft, ob ein Term eine Liste mit der Länge ist == n

save_key(Key) 
    when 
     is_list(Key); 
     length(Key) == 44 -> 

    ok. 

Antwort

4

Um guard Ausdrücke zu kombinieren mit and, können Sie sie mit einem Komma statt Semikolon trennen kann als here erwähnt:

-module(a). 
-export([save_key/1]). 

save_key(Key) 
    when 
     is_list(Key), 
     length(Key) == 44 -> 
    ok; 
save_key(_) -> 
    ko. 
1> c(a). 
{ok,a} 
2> a:save_key([]). 
ko 
3> a:save_key(nil). 
ko 
4> a:save_key(lists:seq(1, 44)). 
ok 

Beachten Sie auch, Da Fehler in Wächtern ignoriert werden, können Sie einfach length(Key) == 44 hinzufügen und erhalten das gleiche Verhalten wie eine Nicht-Liste wird einen Fehler werfen und wird nicht übereinstimmen, dass cla Verwenden Sie:

save_key(Key) when length(Key) == 44 -> 
    ok; 
save_key(_) -> 
    ko. 
+0

Danke, Knospe, es ist genau das, was ich brauche! –

Verwandte Themen